我有这个……</p>
$(document).keypress(function(e) {
if ( e.keyCode === 119 ) // w
doSomething();
});
在我的文档上按“w”时,doSomething()
函数会触发。input
当我当前在字段中输入(焦点)时,如何防止它触发textarea
?
我有这个……</p>
$(document).keypress(function(e) {
if ( e.keyCode === 119 ) // w
doSomething();
});
在我的文档上按“w”时,doSomething()
函数会触发。input
当我当前在字段中输入(焦点)时,如何防止它触发textarea
?
您必须在事件之后过滤掉元素,而不是在选择器中,像这样
$(document).on('keypress', function(e) {
var tag = e.target.tagName.toLowerCase();
if ( e.which === 119 && tag != 'input' && tag != 'textarea')
doSomething();
});
这将检查 的标记名event.target
,即事件源自的元素,并且仅在事件不是源自输入或文本区域时触发该函数。
如果您的事件处理程序绑定到document
,则该事件已经在 input 元素上引发并冒泡到 html 元素,因此您必须在处理程序本身的代码中处理排除。另一种方法是专门为输入元素绑定第二个处理程序,以防止事件冒泡,但这可能不是正确的方法。
$(function() {
$(document).keypress(function(e) {
if ($(e.target).is('input, textarea')) {
return;
}
if (e.which === 119) doSomething();
});
});
ps 您可以查看jQuery 事件对象文档以了解它公开了哪些属性。
在 jQuery 中,e.which
是规范化的属性,而不是e.keyCode
.
要检查您是否不在输入中,您可以检查document.activeElement
:
$(document).keypress(function(e) {
if (e.which === 119 && !$(document.activeElement).is(":input,[contenteditable]")) {
doSomething();
}
});
最简单和完美的解决方案是:
$(document).keypress(function(e) {
if (e.which == 119 && !$(':focus').length) {
doSomething();
}
});