仅当未写入时获取javascript键控事件

仅当未写入时获取javascript键控事件,javascript,keydown,Javascript,Keydown,可能重复: 我写了一个简短的脚本来监听keydown事件,但是如果我在文本字段中写作,我想忽略它 我不知道如何在没有奇怪技巧的情况下完成,比如检查是否有一个输入的焦点 这是我的密码 document.addEventListener('keydown', function(event) { if(event.keyCode == 71) { showSelected(); } else if(event.keyCode == 13) {

可能重复:

我写了一个简短的脚本来监听keydown事件,但是如果我在文本字段中写作,我想忽略它

我不知道如何在没有奇怪技巧的情况下完成,比如检查是否有一个输入的焦点

这是我的密码

document.addEventListener('keydown', function(event) {
    if(event.keyCode == 71) {
        showSelected();
    }
    else if(event.keyCode == 13) {
        closeModal();
    }
});

如果您使用
contenteditable
(比如让用户在页面上想要的任何div/span/box中写入文本),这就有点棘手了

如果是这样的话,这将需要一点思考和返工(这不是那么难-只是更多的参与)

但是,您可以对照要排除的类型列表,检查
event.target
(事件发生的元素)的
标记名属性

function keyEvent (evt) {
    var key = evt.keyCode,
        el = evt.target,
        type = el.tagName.toLowerCase();
        // tag names are upper-case... almost always...
        // so convert one way or the other, to be sure  
    if (type === "input" || type === "textarea") { return; }
    /* do whatever you were going to do */
}
还应该注意的是,这个解决方案(以及到目前为止您的代码)与隔离区IE不兼容。
为此,您需要使用
attachEvent
window.event
window.event.srcElement
属性,因为它们不支持
addEventListener
e
/
事件
函数参数。

只需检查
事件.target

{ 
   if (event.target.tagName.toUpperCase() == 'INPUT') return false;

    // Do your Coding
}

一个糟糕的解决方案是将keydown侦听器添加到所有输入字段并停止传播。应该有一个更聪明的解决方案。请看这里:人们不应该忘记
select
元素等。实际上,我在实现这样一个功能时使用了
evt.target.matchesSelector(“form*”)
。您可以检查它是否是
contenteditable
元素,带有
event.target.iscontenteeditable