Javascript事件处理程序在主体上,但不在输入上
我有以下事件处理程序Javascript事件处理程序在主体上,但不在输入上,javascript,Javascript,我有以下事件处理程序 document.addEventListener('keydown',handleBodyKeyDown,false) 在您的handleBodyKeyDown功能的输入框中,如何防止它发生,请检查 event.target.tagName.toUpperCase() == 'INPUT' (或'TEXTAREA') 注意:对于旧版本的IE,请使用event.srcElement.tagName 像这样: document.addEventListener('keyd
document.addEventListener('keydown',handleBodyKeyDown,false)代码>
在您的handleBodyKeyDown
功能的输入框中,如何防止它发生,请检查
event.target.tagName.toUpperCase() == 'INPUT'
(或'TEXTAREA'
)
注意:对于旧版本的IE,请使用event.srcElement.tagName
像这样:
document.addEventListener('keydown', handleBodyKeyDown, false);
function handleBodyKeyDown(event)
{
var e = event || window.event,
target = e.target || e.srcElement;
if (target.tagName.toUpperCase() == 'INPUT') return;
// Now continue with your function
}
另外,如果页面上有jQuery,为什么要使用addEventListener
?在jQuery中,所有这些都会为您解决:
$(document).on('keydown', ':not(input)', function(e)
{
// Your code goes here...
});
在handleBodyKeyDown
方法中,检查事件是否起源于输入
元素:
function handleBodyKeyDown(event) {
if (event.target.tagName.toUpperCase() === 'INPUT') {
return; // do nothing
}
// do the rest of your code
}
请注意,toUpperCase
调用是必要的,因为决定标记名
属性大小写的条件非常复杂,有时几乎无法控制
请参阅。您可以执行以下操作:
handleBodyKeyDown = function(e) {
var e = e || window.event
if (e.target.tagName != "INPUT") {
// handle this since it isn't input
}
}
有时(对我来说),最好不要阻止它发生,而是在事件中忽略它,当它发生在输入中时。看起来这也是你的情况
只需检查evt.target | | evt.srcmelement
属性(现代框架为您执行此规范化工作,因此,很可能这将被称为目标),无论它是否为输入。如果没有,请忽略。告诉您如何获取事件的目标。您可以检查它是否不是输入:
function doSomething(e) {
var targ;
if (!e) var e = window.event;
if (e.target) targ = e.target;
else if (e.srcElement) targ = e.srcElement;
if (targ.nodeType == 3) // defeat Safari bug
targ = targ.parentNode;
if( targ.tagName != "INPUT" ) {
//Perform your action here
}
}
您的问题被标记为jQuery,在这种情况下,您可以测试event.target,因为框架会为您规范化它
$(document).bind("keydown", function (event) {
if(event.target.tagName != "INPUT") {
//Do something
}
});
如果您使用的是jQuery
,您可以尝试使用is()
方法测试目标元素isinput
,然后什么也不做
function handleBodyKeyDown(event) {
if ($(event.target).is("input")) {
return;
}
else{
//Do your stuff here
}
}
HandleBodyKeyDown函数在任何情况下都将被调用。您不能阻止它调用您指定的录制方法。您只能添加一个逻辑来检查这是否为“输入”和返回。此外(如果需要),您还可以防止它冒泡:
function handleBodyKeyDown(ev) {
ev=ev||event;
var sender=ev.target||ev.srcElement;
if(sender.tagName.toLowerCase()==="input") {
if(ev.stopPropagation)ev.stopPropagation();
else ev.cancelBubble=true; // for IE8 or less
return true; // do not prevent event from default action
}
// your code for global keydown
}
如果您使用的是Prototype(您已经标记了Prototype,但还标记了其他两个框架),那么可以在其中注册和过滤事件,如下所示:
document.on('keydown', ':not(input)', handleBodyKeyDown);
你真的在应用程序中使用jquery、prototype和dojo吗?您是否希望使用纯Javascript或其中一个库提供解决方案?可能使用e.target.matches('input')
来获得更清晰的语法?