Jquery事件涓涓细流

时间:2011-10-06 17:17:18

标签: jquery events

有什么方法可以让jquery事件在DOM中流淌并冒泡起来?

我正在尝试实现一个节点添加到dom时触发的'create'事件。我发现了一些实现,但都有一个共同点,就是插入元素的根触发了一个create事件,但没有一个是子事件。如果用例是给一个节点一个“构造函数”函数,那么create事件是否需要应用于所有新节点呢?

例如,如果我插入一个包含几个列表项的无序列表。我发现所有方法都会触发ul create事件,但是没有任何一个。

我最好的想法是以某种方式绑定事件的涓流阶段,以便事件从ul开始,它们会流入所有li。

由于系统的其余部分正在使用jquery事件,我想保持这种方式,但纯粹的js解决方案也可以。

我现在也只关心webkit,所以任何解决方案都不一定是IE安全的。

由于

@戴夫:

如果我在这里错了,有人会纠正我,但正如我所理解的那样:所有事件(除了IE中的一些事件)首先“冒泡”你的dom树;所以从li到ul到身体,然后转身并“涓涓”回来;从身体到ul到被点击的li和任何一个li的孩子。

你可以通过在大多数浏览器中将addEventListener的第三个参数设置为true来侦听“涓涓细流”的事件(我不认为IE的attachEvent有选项)。

我们既冒泡又涓涓细流,主要是因为在互联网诞生时应该如何应对这种混淆,而且w3c只是采用了它的规格来保持每个人的快乐和向后兼容性。随着时间的推移,逐渐淘汰已经被逐步淘汰,因为在大多数情况下它都没用,这就是为什么我认为jquery没有任何选择。在我看来,“创造”事件是涓涓细流有用的奇怪案例之一。诀窍是如何集成一个创建事件的触发,然后使它成为jquery,以保持浏览器兼容性和我们喜欢的bind()/ trigger()jquery API ...

2 个答案:

答案 0 :(得分:4)

我将在这里发布答案,而不是在评论中讨论。

首先,没有事件在事件目标之下传播。根据w3c,该活动分为三个阶段:捕获目标冒泡。因此,如果有人点击UL,则事件为:

BODY > DIV > UL (capturing)
UL (at target)
UL > DIV > BODY (bubbling)

(它也超越了身体)。值得注意的是,这是,无论绑定事件的元素是什么。您可以将单击事件绑定到DIV,事件将以相同的方式传播。事件目标不一定是绑定事件的元素(即currentTarget)。

捕捉和冒泡阶段都在同一组元素中移动,仅在两个不同的方向。所以你可以看到它更像是一个回调订单。

如果将回调绑定到捕获标志设置为“true”的事件,则只表示此回调将在冒泡中的任何其他事件回调之前执行。

因此,如果在插入DOM内容时触发了“特殊”事件,您可以:

  1. 确保事件起泡
  2. 使插入的DOM的最内部元素成为事件目标
  3. 这样,您可以从容器元素中侦听事件,并确保插入的DOM中的所有元素都是泡泡的一部分。

答案 1 :(得分:0)

jquery委托会做的伎俩。事件绑定到所有当前和未来的子节点。

示例:

$('ul').delegate('li','click',function(){alert("I've been clicked!");});