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(); } }); 
最简单和完美的解决scheme是:
 $(document).keypress(function(e) { if (e.which == 119 && !$(':focus').length) { doSomething(); } });