【问题标题】:Remove an event handler from the child of a bound element从绑定元素的子元素中移除事件处理程序
【发布时间】:2018-10-21 17:32:47
【问题描述】:

我有想要应用到表中行的点击处理程序:

var myTable = $(this);
myTable.on('expand', 'tr', myHandler);
myTable.on('click', 'tr', function () {
    $(this).trigger('expand');
});

function myHandler(e) {
    // my action
}

这是一个非常简化的版本,但它会触发一个扩展行的 jQuery 方法。我想根据其内容从特定行中删除此处理程序。我有一个每次单击该行时都会触发的函数。如果它不匹配设置的条件,则会触发一个方法,显示一条消息,通知用户该问题。我现在想禁用单击以展开该行。

function stopFunction(row) {
    row.find('th[scope=row]').parents("#tableID").off('expand', 'tr', myHandler);
}

以上只是从所有行中删除了单击以展开功能。我不知道如何允许单击其他行,而只是从这个单个表行中删除处理程序。请注意,row.find('th[scope]') 是该行的表格单元格,该行的第一个父级是它的行,然后该行的父级是表格(@tableID)。

【问题讨论】:

    标签: jquery html-table


    【解决方案1】:
    function stopFunction(row) {
        row.on("click", function (e) {
            e.stopPropagation();
        });
    }
    

    Proof of concept.

    【讨论】:

      【解决方案2】:

      正如您所发现的,您的.off 调用将关闭整个事件处理程序。这是因为,使用 on(这是一个很好的做法),您只有一个事件处理程序,它响应所有匹配的元素(在您的情况下为 tr)。

      我建议您改为使用类来执行此操作。向不应扩展的 trs 添加一个类 no-expand,并改用此事件处理程序:

      myTable.on('click', 'tr:not(".no-expand")', function() { ... })
      
      function stopFunction(row) {
        row.addClass("no-expand");
      }
      

      【讨论】:

      • 你先生,该死的。谢谢!
      • 我尝试了这种方法,因为它允许我向特定行添加一个类。这比停止传播更有用,因为这基本上是这样做的,除了我可以通过类而不是所有内容来识别行。 (我知道只有当类匹配时我仍然可以使用停止传播)。
      猜你喜欢
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多