У меня есть форма, которая позволяет пользователю выбрать до X количество вариантов из поля множественного выбора. Если пользователь выбирает элемент больше, чем элементы X, он запрашивает и отменяет выбор последнего выбранного элемента.
Существует проблема, когда предупреждающее сообщение было сгенерировано предыдущим множественным выбором.
Форма имеет 4 мультивыборов, поэтому, если ее выброс на третий мультивыбор или максимальное число уже было достигнуто предыдущим мультивыбором, она выдаст ошибку для следующего мультивыборов независимо от того, Пользователь выбирает правильный номер.
Вот фрагмент кода. Остальные селекты на странице построены одинаково, но используют разные имена:
<select multiple name="seasons[]" size="6" id="seasons" onChange="countSelected(this,5)">
<option value=0>Hold CTRL to select more than one</option>
<?
$ftw = mysql_query("SELECT s.seasonId, s.type FROM seasons s ORDER BY s.seasonId ASC");
while ($line = mysql_fetch_array($ftw)) {
$queried = mysql_query("SELECT seasonId FROM selectedSeason where seasonId = '$line[0]' AND id = '$objItem->itemId'");
if(mysql_fetch_row($queried))
echo "<option selected value=\"$line[0]\">". $line[1] ."</option>";
else
echo "<option value=\"$line[0]\">". $line[1] ."</option>";
}
?>
</select>
Вот JavaScript, чтобы предупредить:
var selectedOptions = [];
function countSelected(select,maxNumber){
for(var i=0; i<select.options.length; i++){
if(select.options[i].selected && !new RegExp(i,'g').test(selectedOptions.toString())){
selectedOptions.push(i);
}
if(!select.options[i].selected && new RegExp(i,'g').test(selectedOptions.toString())){
selectedOptions = selectedOptions.sort(function(a,b){return a-b});
for(var j=0; j<selectedOptions.length; j++){
if(selectedOptions[j] == i){
selectedOptions.splice(j,1);
}
}
}
if(selectedOptions.length > maxNumber){
var throwAlert = true;
select.options[i].selected = false;
selectedOptions.pop();
}
}
if(throwAlert == true){
alert('You may only choose '+maxNumber+' options!!');
document.body.focus();
}
}
seasons должен быть seasons [], чтобы он мог публиковать несколько значений в PHP. У меня нет проблем с публикацией или получением данных только с помощью JavaScript. Ошибка возникает в IE, FF и Safari, но не в Chrome ... увы.
Любые идеи были бы неоценимы.