删除特定对象上的jQuery委托事件处理程序

Meg*_*att 5 javascript jquery delegates event-delegation

我已使用单个选择器将委派的事件处理程序附加到页面上的许多元素.当事件是针对单个元素触发的时候,我想基于某些条件逻辑关闭该元素的事件处理程序.这意味着我不一定要在第一次点击时禁用该事件.但我无法弄清楚如何在不关闭所有这些的情况下做到这一点.

HTML:

<button>One</button>
<button>Two</button>
<button>Three</button>
Run Code Online (Sandbox Code Playgroud)

JS:

$(document).on('click', 'button', function(ev) {
    // doesn't work because argument needs to be a string
    $(document).off('click', $(ev.target));

    // doesn't do what I want b/c turns off events on all buttons, not just this one
    $(document).off('click', 'button');

    // doesn't work because event is on document, not button
    $(ev.target).off('click');
});
Run Code Online (Sandbox Code Playgroud)

jQuery的off文档说我需要提供一个字符串作为第二个参数,而不是jQuery对象($(ev.target)),但是如果我提供一个字符串,那么没有值只引用被点击的项目.

从jQuery的文档:

要删除特定的委托事件处理程序,请提供选择器参数.选择器字符串必须与附加事件处理程序时传递给.on()的选择器字符串完全匹配.要在不删除非委派事件的情况下从元素中删除所有委派事件,请使用特殊值"**".

那么如何关闭特定元素的委托事件处理程序呢?

这是上面代码的JSFiddle

更新:根据提供的初始答案,添加了一些不起作用的选项示例.

lsh*_*tyl 7

通过网络阅读后,答案是你不能!您可以删除全部或全部删除.解决方法可能类似于以下内容.

$(document).on('click', '.btn', function (ev) {
    alert('pressed');
    $(this).removeClass("btn");
});
Run Code Online (Sandbox Code Playgroud)

演示@Fiddle

示例HTML:

<button class="btn">One</button>
<button class="btn">Two</button>
<button class="btn">Three</button>
Run Code Online (Sandbox Code Playgroud)

  • 这个答案似乎提供了很多关于这个问题的见解http://codereview.stackexchange.com/questions/16466/removing-jquery-event-handler-from-single-element-bound-by-delegate (3认同)