jquery off / unbind等递归地将所有事件分离到当前选择器AND children?

时间:2012-01-18 00:53:47

标签: jquery

我正在创建一个Web应用程序,并且无论如何都会进行自己的测试以确认但是想知道是否有人在绑定/解除绑定时有这方面的经验等。例如我想首先销毁当前内容容器的事件和子节点事件,然后在将新内容加载到DIV时加载并附加基于远程脚本的新事件。我可以遍历,但想想它是否已经确实很好。只要我将事件范围保持在内容DIV中,这种方法就可以在保持复杂性方面进行扩展。

根据我的要求,我正在解释我正在做的事情背后的目的。

我正在寻找创建可维护的AJAX Web应用程序。想象一下,您可以向其中添加数百个页面/脚本,并且当您请求新内容时,被调用者除了URL之外不需要知道任何其他内容。这就是我想要的。我已经使用iframe覆盖完成了这个并且效果很好但是我主要关心的是做纯AJAX是在不需要它之后留在内存中的代码,例如事件和闭包引用等。在这方面,iframe覆盖有其优点,因为没有太多考虑参与其中但每次加载新网址的速度较慢,如果您希望页面的某些部分更新,则该方法无法很好地集成。

因此思考过程是创建一种方法,让父DIV通过jQuery加载方法注入新的HTML。加载方法也具有执行脚本的巨大副作用。因此,如果我使用这种方法,我需要创建一个这样做的系统,它不会使浏览器膨胀并留下奇怪的事件行为等。这可能是另一个问题。

更新

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

2 个答案:

答案 0 :(得分:4)

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

如果始终使用事件冒泡方法在父节点上附加事件,请执行以下操作:

$('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 :(得分:2)

快速回答是否定的,但事实并非如此。

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

编辑评论:我会假设你提到递归,你的意思是'后代'而不是'儿童'。在这种情况下(正如你的评论所暗示)“*”正是你正在寻找的。 jsFiddle

$('selector, selector *')

如果这看起来“代价高昂”,那应该是。考虑到这样的计划几乎可以证明是时候重新思考这个问题了。