14 мая 2012 г., 10:17 отOndrej Skalicka

В IE8 он не работает корректно

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

<code><!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="http://google.com">some dummy link</a>
</body>
</html>
</code>

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

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

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

EDIT:

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

change

The change event occurs when a control loses the input focus and its value has been modified since gaining focus. This event is valid for INPUT, SELECT, and TEXTAREA. element.

(спасибо @ mu-is-too-short).

Обойти это можно, добавив размытие по клику + фокус:

<code>function radioClick()
{
 this.blur();  
 this.focus();  
}


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

Ответы на вопрос(3)

14 мая 2012 г., 09:24 отsarkiroka

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

14 мая 2012 г., 09:32 отmu is too short

прекрасная спецификация:

change

The change event occurs when a control loses the input focus and its value has been modified since gaining focus. This event is valid for INPUT, SELECT, and TEXTAREA. element.

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

14 мая 2012 г., 09:31 отBaz1nga

изменения его значения фактически не вызывает событие onChange до тех пор, пока вход не потеряет фокус.

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

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


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

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

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

ВАШ ОТВЕТ НА ВОПРОС