jQuery:触发整个文档的按键功能,但不在输入和textareas内?

mat*_*att 46 javascript jquery keypress

我有这个 …

$(document).keypress(function(e) {
        if ( e.keyCode === 119 ) // w
            doSomething();
    });
Run Code Online (Sandbox Code Playgroud)

在我的文件上按"w"时,该doSomething()功能会激活.当我正在input现场打字(聚焦)时,如何防止它被触发textarea

ade*_*neo 82

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

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

这将检查event.target事件源自的元素的标记名,并仅在事件不是来自输入或textarea时触发函数.

  • 你救了我.我从回答中使用了这个:if(jQuery(e.target).is('input,textarea,select')){return; } (2认同)

nbr*_*oks 13

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

代码演示

$(function() {
    $(document).keypress(function(e) {
        if ($(e.target).is('input, textarea')) {
            return;   
        }
        if (e.which === 119) doSomething();
    });
});?
Run Code Online (Sandbox Code Playgroud)

ps你可以查看jQuery事件对象文档,看看它暴露了哪些属性.


Esa*_*ija 6

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

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

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

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