Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在jQuery中注销委派事件_Javascript_Jquery_Events - Fatal编程技术网

Javascript 在jQuery中注销委派事件

Javascript 在jQuery中注销委派事件,javascript,jquery,events,Javascript,Jquery,Events,假设我有这个: <ul> <li id="l1">aap</li> <li id="l2">noot</li> <li id="l3">wim</li> </ul> 我想实现的是:当用户单击某个li时,应该关闭该li的事件侦听器 这可以工作,但会删除所有li的侦听器: $('ul').on('click', 'li', function() { console.log("You cl

假设我有这个:

<ul>
  <li id="l1">aap</li>
  <li id="l2">noot</li>
  <li id="l3">wim</li>
</ul>
我想实现的是:当用户单击某个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');      

});

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

通常,您会设置单独的处理程序并在单击时解除绑定,但由于委派事件不能设置为单独的处理程序(据我所知),因此我们必须使用变通方法。我通过添加一个类来实现这一点,但可能还有其他几种方法可以区分单击的项目。

解决方案 将类添加到单击的项并排除处理程序中的项

$('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');      

});

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


通常,您会设置单独的处理程序并在单击时解除绑定,但由于委派事件不能设置为单独的处理程序(据我所知),因此我们必须使用变通方法。我通过添加一个类来实现这一点,但可能还有其他几种方法可以区分单击的项目。

只需为每个单击的li添加一个属性,这样它就不会被处理两次。只需为每个单击的li添加一个属性,这样它就不会被处理两次。不幸的是,这不起作用,请参见此提琴:。我假设这不起作用,因为正式没有为'li'注册事件,只有封装的'ul'是的,结果证明jQuery不够聪明,无法弄清楚我们在这里要做什么。我已经做了一个小的变通办法,但应该做的技巧。请参阅更新的答案。不幸的是,这不起作用,请参阅此提琴:。我假设这不起作用,因为正式没有为'li'注册事件,只有封装的'ul'是的,结果证明jQuery不够聪明,无法弄清楚我们在这里要做什么。我已经做了一个小的变通办法,但应该做的技巧。请参阅更新的答案。