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

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

HTML:

   

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'); }); 

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

从jQuery的文档:

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

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

这是上面代码的JSFiddle

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

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

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

演示@Fiddle

示例HTML:

    

问题:您是否必须使用委托事件? LIke LShetty说,不可能删除单个元素的委托事件。 您要么删除整个事件委派,要么保留它。 您可以尝试使用不同的选择器,就像在此示例中一样

 $('button').on('click', function(ev) { $('#output').append('Clicked! '); $(this).off('click'); }); 
     

除了lshettyl所说的(当前的post) – 另外一个工作是将新的事件监听器直接绑定到你试图删除监听器的元素并在其中调用stopPropagation()。

这将做的是阻止事件向上移动DOM并到达最初绑定到文档的事件处理程序。 此外,这将允许您在按钮单击上保留一些function,例如向用户发出已单击此按钮的警报 – 或此类效果。

 $(document).on('click', 'button', function(ev) { // Your logic to occur on button click // Prevent further click on just this button $(this).click(function(event) { event.stopPropagation(); }): });