Вопрос по html, internet-explorer, javascript – В IE8 он не работает корректно

23

Я вынужден работать с 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="http://google.com">some dummy link</a>
</body>
</html>

Я ожидаю, что, когда выбрана вторая радиокнопка, нажатие на первую немедленно вызовет оповещение. Это отлично работает в 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).

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

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


<input type="radio" name="rad" value="1" onclick="radioClick" onchange="alert(1);"/>
странно ... у меня в IE8 с окном XP работает абсолютно нормально. Pranav
отлично работает для меня в IE8 -jsfiddle.net/uMD9h Pranav
@Pranav Нет, попробовал ссылку, которую вы отправили в ie8, и она не будет работать Ondrej Skalicka

Ваш Ответ

3   ответа
8

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

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.

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

+1 полностью с тобой согласен.
29

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

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

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


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

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

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

Ууууууууу, спасибо большое! Я был на этом часами!
согласился .. пришлось ответить на вопрос ..
Большой! Вот это да. большое спасибо
я думаю, что onchange предназначен для этого .. пока элемент управления не потерял фокус, значит, модификация все еще продолжается ...
2

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

потому что изменить только огонь, когда элемент потерял фокус в т.е.
почему онклик ?? onchange подходит для этого.

Похожие вопросы