четверг, 10 января 2008 г.

Перехват нажатия Enter в IE

Вот так уж повелось, что IE не дает спокойно жить всем web-developerам. И меня он не устает удивлять.

Ситуация следующая: в текстовое поле вводится числовое значение, по нажатию Enter это значение передается на сервер (при помощи AJAX). Что может быть проще? Я привязал функцию обновления на событие onchange элемента input (текст). Как обычно, все идеально сработало в FireFox и Safari. А этот IE... При нажатии Enter - вообще ничего не происходило.

Объясняю: в IE Enter вызывает событие "onsubmit" формы.

Решение: input должен находиться в форме. На событие onsubmit ставим return false;
И добавляем следующий код:

processKeyEvent = function(eventType, event)
{
if (window.event)
{
event = window.event;
}
var caller_;
if (event.target)
caller_ = event.target;
if (event.srcElement)
caller_ = event.srcElement;
var code;
if (event.keyCode) code = event.keyCode;
else if (event.which) code = event.which;

switch (code)
{
case 13:
checkEnteredOrder(caller_); // наша функция для обновления
break;
}
};

processKeyPress = function(event)
{
processKeyEvent("onkeypress", event);
};Syhi-подсветка кода


Затем меняем событие onchange на keypress:

input.onkeypress = processKeyPress;


Теперь все проходит через processKeyPress хэндлер, а в нем мы отлавливаем нажатую клавишу по keycode.

P.S.: Чувствую, скоро нужно будет создать отдельную категорию на блоге типа "Умри, IE поганый" или "Instant Evil"





1 комментарий:

[YS.PRO] комментирует...

На http://inf.by/linux/212 правильно подметили:

"Сам браузер Opera, конечно, не идеален в плане веб-разработок, но использовать его ГОРАЗДО приятнее чем IE, ради которого понаписана туча исключений в разметках и скриптах интернета."