jquery off/unbind etc是否递归地将所有事件分离到当前选择器和子级?

jquery off/unbind etc是否递归地将所有事件分离到当前选择器和子级?,jquery,Jquery,我正在创建一个web应用程序,并将自己进行测试以确认,但我想知道是否有人在绑定/解除绑定等操作时有此经验。例如,我想首先销毁当前内容容器的事件和子事件,然后在将新内容加载到DIV中时,加载并基于远程脚本附加新事件。我可以遍历,但我认为如果已经遍历了,那就很高兴知道了。只要我将事件范围保持在content DIV中,这种方法就可以在降低复杂性方面进行扩展 根据请求,我正在解释我所做工作的目的。 我希望创建一个可维护的AJAX web应用程序。想象一下,您可以向它添加数百个页面/脚本,当您请求新内容

我正在创建一个web应用程序,并将自己进行测试以确认,但我想知道是否有人在绑定/解除绑定等操作时有此经验。例如,我想首先销毁当前内容容器的事件和子事件,然后在将新内容加载到DIV中时,加载并基于远程脚本附加新事件。我可以遍历,但我认为如果已经遍历了,那就很高兴知道了。只要我将事件范围保持在content DIV中,这种方法就可以在降低复杂性方面进行扩展

根据请求,我正在解释我所做工作的目的。

我希望创建一个可维护的AJAX web应用程序。想象一下,您可以向它添加数百个页面/脚本,当您请求新内容时,被调用方不需要知道它的URL以外的任何信息。这就是我想要的。我已经使用iframe覆盖层完成了这项工作,并且工作得很好,但是我主要关心的是在不需要之后在内存中留下的代码,例如事件和闭包引用等。iframe覆盖层在这方面有它的优势,因为它不涉及太多的思想,但是每次加载新URL的速度较慢,而且这种方法不需要如果您希望页面的某些部分比其他部分更新,那么可以很好地进行集成

因此,思想过程是创建一种方法,使父DIV通过jqueryload方法注入新的HTML。load方法还有一个很大的副作用,就是在中执行脚本。因此,如果我使用这种方法,我需要创建一个这样做的系统,它不会使浏览器膨胀,不会留下奇怪的事件行为等。这可能是另一个问题

更新


我已经回答了我的问题后,看到这个弹出的代表投票。如果使用事件冒泡方法在父级附加事件,则这实际上不是问题。请看下面我的答案。

快速答案是否定的,不是

.off()与.unbind()类似,它从您选择的任何jquery包装对象中删除所选类型的所有事件处理程序。如果要从更多元素中删除处理程序,请选择更多元素

编辑以供评论:既然您提到了递归,我假设您指的是“后代”而不是“子代”。在这种情况下(正如你的评论所暗示的那样),“*”正是你想要的


如果这看起来“昂贵”,那么它应该是这样的。考虑这样一个计划几乎可以肯定,是时候重新思考这个问题了。

我只是在跟进,因为这已经有一段时间了,我对这个问题有一个非常简单的解决方案

如果始终使用事件冒泡方法在父节点上附加事件,如下所示:

$('parentSelector')
  .on('click', 'someDescendant', function(ev) {
    // code
  })
  .on('focus', 'anotherDescendant', function(ev) {
    // code
  });
那么,删除这些事件是非常直接的:

$('parentSelector').off();
因此,无论何时加载小部件,都可以安全地执行此操作:

$('parentSelector')
  .off()
  .on('click.my-widget', 'someDescendant', function(ev) {
    // code
  }).on('focus', 'anotherDescendant', function(ev) {
    // code
  });

如果您使用这种方法,递归/选择器问题是不存在的。

+1但如果您能进一步调查,找出递归分离之外的最快补救方法,我会检查您的答案。我想“*”可以,但如果不需要,我不希望进行代价高昂的遍历。谢谢。是的,我也会用那个选择器。所以我所看到的是,正如我所想的,没有一个快速的答案。谢谢你的回答。@kitgui.com好吧,可能会有一个快速的答案,但分裂发生的时间比这早。如果您与我们分享问题的具体情况,我们可能会提供不同的解决方案。具体情况是找到一种web应用程序的通用方法,在保持代码可维护性的同时最大限度地提高用户体验。@Orlando是的,这就是文档的优点;)“除了元素本身,与元素关联的所有绑定事件和jQuery数据都将被删除。”看起来jQuery在内部会对所有子元素进行爬网,并使用
jQuery.cleanData
清除所有内容。明白了。但是,我建议只适用于特定小部件的任何绑定都不要高于该小部件。例如:与所有小部件相关的绑定(可能单击隐藏)将出现在所有小部件的容器上,但与特定小部件相关的绑定(可能是lightbox控件)将出现在小部件本身上。
$('parentSelector')
  .off()
  .on('click.my-widget', 'someDescendant', function(ev) {
    // code
  }).on('focus', 'anotherDescendant', function(ev) {
    // code
  });