【问题标题】:Delegate event firing twice委托事件触发两次
【发布时间】:2011-07-29 23:32:47
【问题描述】:

此委托事件触发两次(并非总是如此,有时)。

client.bindButtonClickFunction = function(){

    $("#client-plugin").delegate(".client-button", "click", function()
    {
        var id = this.id.split('-')[2];
        client.retrieveMessageByID(id);
    });
};

我在插入所有“.client-button”后调用该函数。

关于如何阻止它的任何想法?我尝试了 event.stopPropagation(),并且取消授权和重新授权也无济于事。

这是在 Chrome 中,作为 Chrome 插件的一部分。

【问题讨论】:

  • 很难说没有进一步的信息。很可能您两次致电bindButtonClickFunction...顺便说一句。您无需等待插入 .client-buttons,delegate 的工作方式与 live 类似。
  • 您尝试过 stopImmediatePropagation 吗? api.jquery.com/event.stopImmediatePropagation
  • 我刚刚解决了我遇到的两次触发问题。就像@FelixKling 说的那样,我在一些 $(document).ready() 函数内有我的 delegate() 声明,本质上是多次调用该函数。
  • @Eric Di Bari:为什么 $(document).ready() 中的 delegate() 会被调用两次?你能解释一下吗?

标签: jquery delegates


【解决方案1】:

根据您注册代表的方式,您可能需要执行以下操作:

$("#client-plugin").undelegate('event').delegate('event', ...)

另外,尝试从您的处理程序中添加return false

【讨论】:

  • 会回答同样的问题。我建议这样做,然后再次测试以查看它是否仍然被调用两次 - 如果确实如此,您就知道问题出在调用两次的方法上,而不是方法本身。
  • @mrchief:我有同样的问题,即我已经触发了函数,并且被触发的类在我的代码中声明了两次,所以当我点击那个类时,它触发了两次,如果我使用 return false 那么我的复选框没有被选中,请你告诉任何其他解决方案吗?
  • @Suleman: UnDelegate 也应该适用于您的情况。第二个实例化应该取消注册,然后注册你的处理程序一次。如果您还有其他问题,请打开一个新问题并发布一些代码。
【解决方案2】:

你需要停止立即传播

   $("#client-plugin").on(".client-button", "click", function (e) {
    e.stopImmediatePropagation();
    var id = this.id.split('-')[2];
    client.retrieveMessageByID(id);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    相关资源
    最近更新 更多