javascript - 在 jQuery 中取消注册委托(delegate)事件

标签 javascript jquery events

假设我有这个:

<ul>
  <li id="l1">aap</li>
  <li id="l2">noot</li>
  <li id="l3">wim</li>
</ul>

使用这个 jQuery 代码:

$('ul').on('click', 'li', function() {      
  console.log("You clicked on " + $(this).text());
})

我想要实现的目标如下:当用户单击其中一个 li 时,仅应关闭该 li 的事件监听器。

这有效,但会删除所有 li 的监听器:

$('ul').on('click', 'li', function() {
  console.log("You clicked on " + $(this).text());

  $('ul').off('click');
})

我阅读了有关 jQuery 的“on()”和“off()”的文档,但无法将它们放在一起。

有什么想法吗?

最佳答案

解决方案

向单击的项目添加一个类,并在处理程序中排除这些项目。

$('ul').on('click', 'li:not(.ignore)', function() {

  console.log("You clicked on " + $(this).text());

  // This adds a class to prevent the handler from hitting again
  $(this).addClass('ignore');      

});

参见https://jsfiddle.net/79yp6hpq/3/

说明

如果你仔细想想,你所看到的行为是有道理的。您告诉它删除 'ul' 的点击处理程序,该处理程序正在处理所有“li”点击。

通常,您会设置单独的处理程序并在单击时取消绑定(bind)它们,但由于委托(delegate)事件不能设置为单独的处理程序(无论如何,据我所知),我们必须使用解决方法。我通过添加一个类来完成此操作,但可能还有其他几种方法可以区分已单击的项目。

关于javascript - 在 jQuery 中取消注册委托(delegate)事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38980019/

相关文章:

c# - 如何将鼠标和键盘事件发送到另一个进程?

javascript - Nodejs/Express 生成脚本链接

javascript - 指定 ember 组件的目标操作

javascript - 在 angular.js 应用程序中维护页面刷新时的客户端页面状态

javascript - 如果我在窗口宽度大于 800px 时刷新网站,jQuery 单击事件不起作用

C# BackgroundWorker 问题

events - 在 MIDI channel 事件中解码 RPN

javascript - WebGL 在逐像素操作中使用库的速度是否更快?

javascript - 我无法让循​​环工作数据已加载

javascript - 我如何将这个动态 CSS 点图变成折线图?