输入处于焦点时防止按键事件触发

时间:2010-11-13 08:52:40

标签: javascript jquery javascript-events event-handling

我正在使用开关在按下某个键时触发一些代码。这不是确切的代码,但它基本上是我使用的(这只是为了在这里保持简短和简单。)

$(document).keydown(function(e) {
switch(e.keyCode) { 

case 39:
e.preventDefault();
    alert("Arrow Key");

break;

case 37:
   e.preventDefault();
    alert("Arrow Key");
}
});

当输入框处于焦点时,如何防止事件触发?

3 个答案:

答案 0 :(得分:4)

我认为您的意思是,只有当目标元素不是e.preventDefault()标记时,您才想要input。你可以这样做:

$(document).keydown(function(e) {
    if (e.target.nodeName.toLowerCase() !== 'input') {
        switch(e.keyCode) { 
            case 39:
                e.preventDefault();
                alert("Arrow Key");

                break;

            case 37:
                e.preventDefault();
                alert("Arrow Key");
        }
    }
});

e.target是事件发起的元素。或者,您可以使用jQuery的事件委托API:

$(document).delegate(':not(input)', 'keydown', function(e) {
    switch(e.keyCode) { 
        case 39:
            e.preventDefault();
            alert("Arrow Key");

            break;

        case 37:
            e.preventDefault();
            alert("Arrow Key");
    }
});

编辑更新了我的回答“不是输入”,而不是“是输入”检查。

答案 1 :(得分:1)

可能有更优雅的方式,但我会做这样的事情:

var inputHasFocus = false;
$("#some_input_id").focusin(function () {
    inputHasFocus = true;
}).focusout(function () {
    inputHasFocus = false;
});

然后在你的案例陈述中使用它。

答案 2 :(得分:1)

您可以使用document.activeElement返回当前关注的元素。

来自MDN的简要文档:

  

返回当前关注的元素,即,如果用户键入any,将获取击键事件的元素。该属性是只读的。

也就是说,为了防止当输入处于焦点时触发按键事件,您可以忽略当焦点元素为input时的按键事件处理

if (!$(document.activeElement).is("input"){ /* handle keystroke events here */ }