Javascript / JQuery: как добавить событие нажатия клавиши / размытия, которое не запускается дважды с окном предупреждения? Только IE

У меня есть поле ввода, которое я хотел бы проверить, когда пользователь либо нажимает клавишу ввода, либо щелкает от него, для этого я использую события keypress и blur. Если ввод не прошел проверку, вызывается окно предупреждения.

Я заметил, что в IE (все версии), если я нажимаю ввод с недопустимым вводом, по какой-то причине запускаются события нажатия клавиш и размытия (я подозреваю, что это окно предупреждения, но оно не делает этого в FF / Chrome) и он показывает два одинаковых окна предупреждений. Как сделать так, чтобы показывалась только одна?

РЕДАКТИРОВАТЬ: В FF / Chrome я теперь заметил, что второе окно предупреждения появляется, когда я нажимаю в любом месте после попытки подтвердить с помощью ввода.

Упрощенный код:

$("#input-field").keypress(function(event) {
    if (event.keycode == 13) {
        event.stopPropagation();
        validate();
        return false;
    }
});

$("#input-field").blur(function() {
    validate();
});

function validate() {
    if ($("#input-field").val() == '') {
        alert("Invalid input");
    }
}

РЕДАКТИРОВАТЬ: Ага. Не совсем исправление, но отдельная деталь, которую я забыл - мне нужно восстановить недопустимый ввод до его ранее действительного значения, поэтому, когда функция проверки снова проверяет значение, она не терпит неудачу дважды.


person nicobatu    schedule 14.09.2011    source источник
comment
Оповещения плохи для проверки   -  person epascarello    schedule 14.09.2011
comment
@epascarello: Пожалуйста, объясните, что в них такого плохого, в контексте проверки.   -  person Blazemonger    schedule 14.09.2011


Ответы (2)


В итоге я просто проверил IE UserAgent и пропустил событие нажатия клавиши для IE (привязка нажатия клавиш и размытия к той же функции, как показано ниже). К сожалению, это не прямое или потрясающее решение, но я безуспешно искал решение той же проблемы. Некоторые незначительные примечания, которые могут быть полезны: jQuery нормализует это, поэтому вы можете уверенно использовать e.which == 13 при нажатии клавиш. Я бы также объединил функции в одну привязку, например

$("#input-field").bind('blur keypress', function(e) {
    if(e.which == 13) {
        // keypress code (e.g. check for IE and return if so)
    }
    validate();
});

Я пробовал устанавливать глобальные переменные и использовать jQuery data () для назначения произвольных флагов, чтобы указать, была ли (в вашем случае) проверка уже запущена для элемента, но события запускаются одновременно или, по крайней мере, если последовательно, достаточно быстро, что даже с открывающая строка, устанавливающая для некоторого флага значение true, не помогала. Я читал, что небольшая задержка обратного вызова может помочь, но это чертовски грязно, и я бы не стал делать это даже в качестве обходного пути, поэтому я не тестировал его. stopPropagation () и preventDefault () тоже не помогли.

person swornabsent    schedule 04.05.2012

Firefox неправильно обрабатывает событие keypress. Эти события запускаются только при нажатии комбинации клавиш, создающей символ (что не то же самое, что нажатие любой клавиши).

Вместо этого используйте keydown (так как это, вероятно, единственное событие, которое IE обрабатывает правильно - как и должно быть, поскольку MS "изобрела" его ;-)).

См. http://www.quirksmode.org/dom/events/keys.html.

person lsoliveira    schedule 16.12.2011