Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript事件处理程序在主体上,但不在输入上_Javascript - Fatal编程技术网

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()
方法测试目标元素is
input
,然后什么也不做

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')
来获得更清晰的语法?