【问题标题】:jquery: do this on keyup, unless the person is in a textarea or inputjquery:在 keyup 上执行此操作,除非该人在文本区域或输入中
【发布时间】:2011-04-16 19:41:37
【问题描述】:

我的脚本有效,但我不明白如何使它在 textarea/input 中并且按下这些键时不启动功能。 aka:当用户按下该键时启动事件,除非用户在 textarea/input 中。

$('body').keyup(function (event) {

var direction = null;
if (event.keyCode == 37) {
  $('#wrapper').fadeOut(500)
} else if (event.keyCode == 39) {
        $('html,body').animate({scrollTop: $('body').offset().top}, {duration: 1500, easing: 'easeInOutQuart'}
        )
return false;    
}
     })

【问题讨论】:

    标签: jquery onkeyup


    【解决方案1】:

    只需检查 event.target:

    $('body').keyup(function(event) {
        if ($(event.target).is(':not(input, textarea)')) {
           ...
        }
    });
    

    在这种情况下,您仍然只有一个事件处理程序(附加到主体),但它会过滤接收事件的元素

    【讨论】:

    • 如果您不想处理它,为什么要首先将事件分配给输入?
    • 这里我们将事件分配给正文,而不是输入。稍后只需使用输入和文本区域进行过滤。然后将事件分配给除输入之外的所有元素要好得多
    【解决方案2】:

    试试:

    $('body *:not(textarea,input)').keyup(function (event) {
    
    });
    

    【讨论】:

    • 这样的选择是不正确的,因为它会添加尽可能多的事件处理程序,就像页面上的元素一样多。
    • 几乎正确(不包括文本区域),但这会起作用
    【解决方案3】:
    $('body :not(textarea,input[type=text])').keyup(function (event) {
    

    或

    $('body').not('textarea,input[type=text]').keyup(function (event) {
    

    【讨论】:

    • 这个和Thariama的解决方案有同样的问题
    • 想象一下这个页面有 10000 个元素(不要太多)。你会为每个元素分配事件吗?这没有意义
    • 我想这对 OP 来说是一个很好的设计决策。然而,不是他要问的。
    • 我只是建议考虑一下您的解决方案的性能。无论他要求什么。
    猜你喜欢
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 2010-10-03
    • 2011-09-04
    相关资源
    最近更新 更多