jQuery:在整个文档触发按键function,但不是内部input和textareas?
我有这个 …
$(document).keypress(function(e) { if ( e.keyCode === 119 ) // w doSomething(); });
当我在文档上按“w”时, doSomething()
函数会触发。 当我正在input
字段或textarea
input(焦点)时,如何防止它被触发?
你必须在事件之后滤出元素,而不是在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(); } });