Следующий код безобразен, но он делает именно то, что вы хотите (я думаю).По сути, я перехватываю все события onChange и обрабатываю их, только если есть соответствующее событие onClick, которое приводит к изменению значения.Также обратите внимание, что события изменения обрабатываются до событий щелчка.РЕДАКТИРОВАТЬ: Только что связал это не работает в Chrome, поэтому я добавил некоторый код обнаружения браузера, чтобы он выполнялся только в Firefox.
ПРИМЕЧАНИЕ. Текущий код не будет работать, если пользователь вставил вкладку в поле выбора ивнес свои изменения с помощью клавиш ошибок, но метод, описанный ниже, можно легко адаптировать и для этого случая.Вам просто нужно обрабатывать ключевые события, такие как стрелка вверх или стрелка вниз или TAB или ENTER, точно так же, как щелчки обрабатываются ниже, но только тогда, когда поле выбора было в фокусе.
ПРИМЕЧАНИЕ 2. Игра с этим больше, поведение очень странное.Если вы выходите из выбора, событие onChange не запускается, а сохраняется.Если в какой-либо последующий момент вы нажмете в любом месте на экране, событие onChange будет инициировано для значения, на которое вы навели курсор, когда вы сбежали, даже если это значение было фактически изменено сразу после вашего побега.Так что это становится сложно.Я думаю, что вам, возможно, придется рассматривать 2 случая отдельно.Один случай для обработки кликов, а другой - для выхода из выхода (на что ответил Патрик).
Становится волосатым, и я не вижу элегантного способа закодировать это.Как насчет примечания для пользователя рядом с текстовым полем, в котором говорится: «Выбранный в данный момент параметр 1 больше недоступен».Тогда у вас может быть поле выбора только с доступными опциями.
<select name="select" size="1" onChange="handleChange()" onClick="handleClick()" >
<option>0</option>
<option selected disabled>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
</select>
<br />
<script>
var initialValue = document.getElementsByName('select')[0].selectedIndex;
var potentialChange;
var processClick;
function handleClick() {
//ignore this code if not firefox
if (navigator.userAgent.indexOf("Firefox") === -1)
return;
var curVal = document.getElementsByName('select')[0].selectedIndex;
if (!processClick)
return;
// a value change click occured, now we actually process it.
document.getElementsByName('select')[0].value = potentialChange;
}
function handleChange() {
// save the potential change, which will be used if a real click was detected
potentialChange = document.getElementsByName('select')[0].selectedIndex;
processClick = (potentialChange !== initialValue);
// undo the attempted change, in case of an escape or page click
// but only on firefox
if (navigator.userAgent.indexOf("Firefox")!=-1)
document.getElementsByName('select')[0].value = initialValue;
document.getElementsByName('select')[0].value = initialValue;
}
</script>
<a href="javaScript:alert(document.getElementsByName('select')[0].selectedIndex);">getSelected</a>