48

我有这个……</p>

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

在我的文档上按“w”时,doSomething()函数会触发。input当我当前在字段中输入(焦点)时,如何防止它触发textarea

4

4 回答 4

86

您必须在事件之后过滤掉元素,而不是在选择器中,像这样

$(document).on('keypress', function(e) {
    var tag = e.target.tagName.toLowerCase();
    if ( e.which === 119 && tag != 'input' && tag != 'textarea') 
        doSomething();
});

这将检查 的标记名event.target,即事件源自的元素,并且仅在事件不是源自输入或文本区域时触发该函数。

于 2012-08-04T10:41:10.250 回答
13

如果您的事件处理程序绑定到document,则该事件已经在 input 元素上引发并冒泡到 html 元素,因此您必须在处理程序本身的代码中处理排除。另一种方法是专门为输入元素绑定第二个处理程序,以防止事件冒泡,但这可能不是正确的方法。

代码演示

$(function() {
    $(document).keypress(function(e) {
        if ($(e.target).is('input, textarea')) {
            return;   
        }
        if (e.which === 119) doSomething();
    });
});​

ps 您可以查看jQuery 事件对象文档以了解它公开了哪些属性。

于 2012-08-04T11:10:54.353 回答
6

在 jQuery 中,e.which是规范化的属性,而不是e.keyCode.

要检查您是否不在输入中,您可以检查document.activeElement

$(document).keypress(function(e) {
    if (e.which === 119 && !$(document.activeElement).is(":input,[contenteditable]")) {
        doSomething();
    }
});

演示。http://jsfiddle.net/pxCS2/1/

于 2012-08-04T11:26:33.697 回答
2

最简单和完美的解决方案是:

$(document).keypress(function(e) {
    if (e.which == 119 && !$(':focus').length) {
        doSomething();
    }
});
于 2013-03-14T13:04:49.840 回答