Подтвердить что ты не робот

JQuery: триггерная функция нажатия на весь документ, но не внутренние входы и текстовые поля?

У меня есть это...

$(document).keypress(function(e) {
        if ( e.keyCode === 119 ) // w
            doSomething();
    });

Wo при нажатии "w" на моем документе срабатывает функция doSomething(). Как я могу предотвратить его запуск при вводе текста (в фокусе) в поле input или textarea?

4b9b3361

Ответ 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();
    }
});