Подтвердить что ты не робот

Onchange on radiobutton неправильно работает в IE8

Я вынужден работать с IE8 (8.0.7601.17514), и у меня есть эта простая страница:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" >
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
<form action=".">
    <input type="radio" name="rad" value="1" onchange="alert(1);"/>
    <input type="radio" name="rad" value="0" onchange="alert(0);" checked="checked"/>
</form>
<a href="#" onclick="location.href='http://google.com'; return false;">some dummy link</a>
</body>
</html>

Что я ожидаю, так это то, что, когда выбран второй переключатель, щелчок по первому немедленно вызовет предупреждение. Это отлично работает в FF.

На самом деле происходит то, что когда я нажимаю на первое радио, ничего не происходит. Затем, когда элемент размыт (например, я щелкнул в другом месте, другое радио, некоторое соединение на странице и т.д.), ТОГДА предупреждение поднято.

Есть ли обходной путь к этому?

EDIT:

очевидно, это поведение в точности соответствует спецификация W3C

изменить

Событие изменения происходит, когда элемент управления теряет фокус ввода, и его значение было изменено с момента получения фокуса. Это событие действует для INPUT, SELECT и TEXTAREA. элемент.

(благодаря @mu-is-too-short).

Обходной путь к этому заключается в том, чтобы добавить onclick blur + focus:

function radioClick()
{
 this.blur();  
 this.focus();  
}


<input type="radio" name="rad" value="1" onclick="radioClick" onchange="alert(1);"/>
4b9b3361

Ответ 1

В Internet Explorer (по крайней мере до IE8) нажатие на переключатель или флажок, чтобы изменить его значение, фактически не вызывает событие onChange, пока вход не потеряет фокус.

Таким образом, вам нужно каким-то образом инициировать событие размывания самостоятельно. Одно предложение: иметь функцию: следующим образом:

function radioClick()
{
 this.blur();  
 this.focus();  
}


<input type="radio" name="rad" value="1" onclick="radioClick" onchange="alert(1);"/>

Теперь ваше событие onchange должно быть запущено, но, как вы видите, это избыточный код, поэтому вам лучше просто использовать обработчик событий onclick.

Лучшее решение - использовать современную библиотеку javascript, такую ​​как jquery, которая обрабатывает все эти причуды для вас.

Ответ 2

Технически, IE действительно получил это право. Из тонкой спецификации:

изменить

Событие изменения происходит, когда элемент управления теряет фокус ввода, и его значение было изменено с момента получения фокуса. Это событие действует для INPUT, SELECT и TEXTAREA. элемент.

Итак, чтобы событие изменения было триггером, спецификация говорит, что элемент должен терять фокус (т.е. требуется размытие). Обычным kludge является использование обработчика кликов или принудительное размытие, как предложили другие.

Ответ 3

использовать onclick, но т.е. вызывает обработчик события до того, как значение (или проверенный атрибут) было изменено msdn