jQuery:在整个文档触发按键function,但不是内部input和textareas?

我有这个 …

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

当我在文档上按“w”时, doSomething()函数会触发。 当我正在input字段或textareainput(焦点)时,如何防止它被触发?

你必须在事件之后滤出元素,而不是在select器中,像这样

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

这将检查event.target的标记名, event.target是事件源自的元素,并且只在事件不是来自input或textarea的情况下触发该函数。

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

代码演示

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

ps你可以看一下jQuery事件对象文档 ,看看它公开的属性。

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

要检查你是否不在input中,你可以检查document.activeElement

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

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

最简单和完美的解决scheme是:

 $(document).keypress(function(e) { if (e.which == 119 && !$(':focus').length) { doSomething(); } });