- У меня есть
<input type=text>
с focusout
обработчиком событий
- У меня есть
<button>
с обработчиком события клика
Focusout проверяет правильность формата в поле ввода. Это делается путем проверки входного значения с помощью регулярного выражения. В случае неудачи он отображает сообщение (через некоторое время div
исчезает и исчезает) и перефокусирует мой ввод, вызывая
window.setTimout(function() { $(this).focus(); }, 10);
, поскольку я не могу перефокусироваться в focusout
обработчике событий. focusout
событие также не может быть отменено. Просто к вашему сведению.
Click собирает данные из элементов ввода и отправляет их с помощью Ajax.
проблема
Когда пользователь TABs проходит через форму, все в порядке. Когда определенное поле ввода не проходит проверку форматирования, оно перефокусируется сразу после нажатия пользователем TAB .
Но когда пользователь не использует TAB , а вместо этого нажимает на каждое отдельное поле ввода, все работает нормально, пока они не нажмут button
. focusout
срабатывает и устанавливает тайм-аут для перефокусировки. Поскольку время ожидания очень короткое, фокусировка происходит потом, а затем событие click
запускается и выдает запрос Ajax.
Вопрос
Я реализовал проверку форматирования как независимый плагин jQuery, который я хочу оставить таким. Он использует .live()
для присоединения focusout
ко всем полям ввода с определенным атрибутом, в котором определено регулярное выражение формата.
Представление данных также является общим, и я не хочу, чтобы это зависело от плагина форматирования. Они оба должны оставаться независимыми.
Как я могу предотвратить выполнение события click без зависимости этих двух плагинов?
Пример кода, который я возился с
После некоторых поисков я увидел, что все основные браузеры поддерживают document.activeElement
, но я не могу заставить его работать в Chrome. FF и IE оба сообщают, что this
является активным элементом, но Chrome всегда говорит, что активен BODY
, даже если click
сработал на элементе button
.
Проверьте этот код http://jsfiddle.net/Anp4b/1/ и нажмите на кнопку. Протестируйте с Chrome и другим браузером и увидите разницу.