如何选择整个页面,而不是里面的输入字段?

时间:2011-12-04 21:51:07

标签: javascript jquery javascript-events jquery-selectors

<body>
  <div>Sample div</div>
  <input type='text'/>
</body>

$(document).delegate('body *:not(input)', 'keyup', function(e){
    if((e.keyCode || e.which) == 39){ //right arrow
        $('#next_image').click();
    }
    if((e.keyCode || e.which) == 37){ //left arrow
        $('#prev_image').click();
    }
}

我正在使用jQuery Cycle库来设置幻灯片。它更像是一个相册,你可以使用键盘快捷键来做一些事情。因此,幻灯片显示是整个页面,其中还包含输入字段。因此,当您在输入字段内写入文本并尝试使用键盘(左箭头和右箭头按钮)移动光标时,它将触发事件并滚动到下一个/上一个图像。

关于如何在输入字段上启用所有内容的键盘事件的任何想法?显然,当前选择器不起作用。

1 个答案:

答案 0 :(得分:3)

如果您想坚持使用.delegate()而不是当前受欢迎的.on()

$(document).delegate(':not(input)', 'keyup', function (e)
{
    if (e.which === 39) $('#next_image').click();
    else if (e.which === 37) $('#prev_image').click();
});
  • jQuery规范化密钥代码信息,因此您只需要检查event.which
  • 如果您确实需要检查keyCodewhich(e.keyCode || e.which) == 39将无法正常工作,因为||将评估为第一个真正的操作数,或者第二个操作数,如果两个都是假的。换句话说:你必须分别检查每一个,如下所示:

    if (e.which === 39 || e.keyCode === 39)
    
  • 通常最好使用===代替==。请参阅Which equals operator (== vs ===) should be used in JavaScript comparisons?

  

不起作用......它仍然在<input>

中触发了keyup事件

啊,是的。我在想这是因为事件冒泡。

我看到它使用额外的事件处理程序解决了(gallery中的imgur标题框):

$('input').live('keyup', function (e) {
    if(!e.ctrlKey && !e.altKey && !e.metaKey) {
        if(e.keyCode==37 || e.keyCode==39 || e.keyCode==13) {
            e.stopPropagation();
        }
    }
    return true;
});

http://jsfiddle.net/mattball/DQusL/