Рассмотрим этот пример кода:
<div class="containter" id="ControlGroupDiv">
<input onbeforeupdate="alert('bingo 0'); return false;" onclick="alert('click 0');return false;" id="Radio1" type="radio" value="0" name="test" checked="checked" />
<input onbeforeupdate="alert('bingo 1'); return false;" onclick="alert('click 1');return false;" id="Radio2" type="radio" value="1" name="test" />
<input onbeforeupdate="alert('bingo 2'); return false;" onclick="alert('click 2');return false;" id="Radio3" type="radio" value="2" name="test" />
<input onbeforeupdate="alert('bingo 3'); return false;" onclick="alert('click 3');return false;" id="Radio4" type="radio" value="3" name="test" />
<input onbeforeupdate="alert('bingo 4'); return false;" onclick="alert('click 4');return false;" id="Radio5" type="radio" value="4" name="test" />
<input onbeforeupdate="alert('bingo 5'); return false;" onclick="alert('click 5');return false;" id="Radio6" type="radio" value="5" name="test" />
</div>
В FireFox 2 и 3, установка return false
на событие щелчка переключателя предотвращает изменение значения этого параметра и всех других переключателей в группе. Это эффективно делает его доступным только для чтения, не отключая его и не переводя в серый цвет.
В Internet Explorer, если установлен другой переключатель и вы щелкнете по другому в группе, этот флажок сбрасывается до того, как событие щелчка срабатывает на тот, который вы щелкнули. Однако тот, на котором вы щелкнули, не будет выбран из-за 'return false' в событии click.
Согласно MSDN , событие onbeforeupdate
срабатывает на всех элементах управления в группе управления до того, как сработает событие щелчка, и я предположил, что именно там очищалась другая радиокнопка , Но если вы попробуете приведенный выше код, оповещение о событии onbeforeupdate
не появится - вы просто получите оповещение о событии щелчка. Очевидно, что это событие никогда не будет запущено, или нет способа его поймать.
Есть ли какое-либо событие, которое вы можете перехватить, что позволит вам предотвратить сброс других переключателей в группе?
Обратите внимание, что это упрощенный пример, мы на самом деле используем jQuery для установки обработчиков событий и обработки этого.
Обновление:
Если добавить это событие к одной из переключателей:
onmousedown="alert('omd'); return false;"
Появляется окно предупреждения, вы закрываете его, и событие щелчка никогда не срабатывает . Поэтому мы подумали, что разобрались, но нет, это не может быть так просто. Если вы удалите предупреждение и измените его на следующее:
onmousedown="return false;"
Это не работает. Другие переключатели сбрасываются, и срабатывает событие нажатия на кнопку, которую вы нажали. onbeforeupdate
до сих пор никогда не стреляет.
Мы думали, что это может быть время (это всегда теория, хотя это редко и правда), поэтому я попробовал это:
onmousedown="for (i=0; i<100000; i++) {;}; return false;"
Вы щелкаете, он приостанавливается на некоторое время, затем другой переключатель выключается, и затем срабатывает событие щелчка. Aaargh!
Обновление:
Internet Explorer отстой. Если кто-то не придумает хорошую идею, мы отказываемся от этого подхода и выбираем расширение jQuery, которое делает то, что мы хотим, но увеличивает нагрузку на клиентские скрипты на странице и требует большего перекодирования HTML из-за сервер рендеринга ASP.Net и отображение имени главной страницы.