【问题标题】:Filter 'onchange' 'onkeypress' [duplicate]过滤“onchange”“onkeypress”[重复]
【发布时间】:2013-06-28 12:17:30
【问题描述】:

如果两个事件都被触发,有没有办法只处理其中一个事件?如果我更改值并按下键,我最终会重新绑定网格两次,因为事件是按顺序到达的。我知道我得到的是正确的行为并且我得到了我所要求的,但我需要一种方法来阻止第二个事件的传播。我正在寻找事件级别的解决方案(不是 isGridBinded 标志)。

      $(op.$txtBox).on('change keypress', function (e) {
            if ((e.keyCode == 13 && e.type == 'keypress')  || e.type == 'change') {
                localWidget._rebindGrid();
            }
        });

【问题讨论】:

  • stackoverflow.com/questions/2363360/… 类似问题 - 没有答案。
  • 你能提供一个带有相关代码的jsfiddle吗?!
  • @BrokenHeartღ 您的链接与委托相关,此处 OP 不委托事件
  • 你的小提琴有一个错误,如果你处理 keyup,if 语句也应该检查 keyup。如果您将 keyup 改回 keypress,运行它然后输入值,从字段中松开焦点然后输入其他值并按 Enter,您将获得两个日志。
  • @roasted 再次检查此链接是针对 .on 的,因为 OP 要求。

标签: javascript javascript-events jquery


【解决方案1】:

使用这样的事件:

$(op.$txtBox).on({
    change: function(){
          localWidget._rebindGrid();
     },
     keypress: function(e){
         if(e.keyCode == 13)
            localWidget._rebindGrid();
     },
});

参考: JQuery .on() method with multiple event handlers to one selector

或者你可以使用jQUery的bind()函数。

【讨论】:

  • 这会对 OP 的问题产生什么影响?
  • @roasted 我正在更新代码。
  • @roasted 尝试使用警报更改 console.log。
  • 抱歉,调试时您需要使用控制台而不是警报。警报专门针对事件更改某些浏览器的行为。顺便说一句,在这里,如果您在输入中键入某些内容,这仍然会发出两次警报(如果输入值更改,则会触发 onchange,如果仍然相同,则不会)jsfiddle.net/rEwML
【解决方案2】:

改用 keyup 事件。

否则,我能想到的唯一方法是使用超时来限制它:

DEMO

(function () {
    var timeout;
    $('input').on('change keypress', function (e) {
        clearTimeout(timeout);
        timeout = setTimeout(function () {
            if ((e.keyCode == 13 && e.type == 'keypress') || e.type == 'change') {
                console.log(1);
            }
        }, 0);
    });
})();

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 2014-11-23
相关资源
最近更新 更多