JQuery: триггерная функция нажатия на весь документ, но не внутренние входы и текстовые поля?
У меня есть это...
$(document).keypress(function(e) {
if ( e.keyCode === 119 ) // w
doSomething();
});
Wo при нажатии "w" на моем документе срабатывает функция doSomething()
. Как я могу предотвратить его запуск при вводе текста (в фокусе) в поле input
или textarea
?
Ответы
Ответ 1
Вам нужно будет отфильтровать элементы после события, а не в селекторе, например
$(document).on('keypress', function(e) {
var tag = e.target.tagName.toLowerCase();
if ( e.which === 119 && tag != 'input' && tag != 'textarea')
doSomething();
});
это проверяет тэг event.target
, элемент, из которого возникло событие, и только запускает функцию, если событие не произошло из ввода или текстового поля.
Ответ 2
Если ваш обработчик событий привязан к document
, событие будет уже поднято на элементе ввода и заштриховано до элемента html, поэтому вам придется обрабатывать исключение в коде самого обработчика. Альтернативой является конкретное связывание второго обработчика входных элементов, который предотвращает пузырьковое событие, но это, вероятно, не правильный подход.
Демо-версия кода
$(function() {
$(document).keypress(function(e) {
if ($(e.target).is('input, textarea')) {
return;
}
if (e.which === 119) doSomething();
});
});
p.s. вы можете посмотреть документацию события события jQuery, чтобы узнать, какие свойства он предоставляет.
Ответ 3
В jQuery e.which
- нормализованное свойство, а не e.keyCode
.
Чтобы проверить, не находитесь ли вы на входе, вы можете проверить document.activeElement
:
$(document).keypress(function(e) {
if (e.which === 119 && !$(document.activeElement).is(":input,[contenteditable]")) {
doSomething();
}
});
Demo. http://jsfiddle.net/pxCS2/1/
Ответ 4
Самое простое и идеальное решение:
$(document).keypress(function(e) {
if (e.which == 119 && !$(':focus').length) {
doSomething();
}
});