2011-12-26 37 views
1

我编写了一个示例JavaScript程序来演示jQuery函数click,delegatelive的令人困惑的不同事件冒泡行为。为什么“click”,“delegate”和“live”在使用jQuery的事件冒泡方面表现不同?

这里是demo page

对于每个功能,有一个包装和在包装一个点击链接,这两者都与点击事件功能登记。

我注意到

  1. livedelegate使用stopPropagation并不妨碍事件冒泡
  2. livedelegate,在包装的点击事件被触发第一和旁边的点击链接。但是,这个顺序与click函数相反。

任何人都可以解释这两种现象吗?

该示例使用jQuery 1.6.4,但您可以调整版本。

+0

jQuery的[ doco for .'live()'](http://api.jquery.com/live/)和['.delegate()'](http://api.jquery.com/delegate/)解释了这一点 - 做了你在发布你的问题之前看看doco? – nnnnnn 2011-12-26 05:52:06

+0

我试过但发现有点难理解...... – xiaohan2012 2011-12-26 06:31:56

回答

2

要开始,live is deprecated支持jQuery 1.7+中的ondelegate。我现在会停止使用live而不是稍后。上面链接的文档实际上非常翔实,并且很好地解释了这些功能的工作原理。

代表和生活都依靠冒泡。这与点击有何不同。这个事件已经引起了他们的注意。代表优于生活,因为您告诉它监视特定的父级,而直到文档级别直播。非常贵。

jQuery的文档是值得引用在这里:

由于.live()方法处理事件一旦他们传播到 文件的顶部,它是不可能停止的 现场活动传播。同样,由.delegate()处理的事件将传播 到它们被委派的元素;绑定在 上的事件处理程序在调用委托事件处理程序之前,DOM树下面的任何元素都已执行 。因此,这些处理程序 可能会阻止调用event.stopPropagation()或返回false的被委派处理程序触发 。

1

如果您了解live和delegate的实现,那么您应该理解这种差异的原因。以某种方式存在和委托不会附加到元素,因为该元素在绑定时不存在,因此它们分别附加到根或特定的父项,因此也有所不同。他们利用事件的冒泡,这样当事件冒泡从孩子到根目录,否则执行新添加的元素看到的详细视图解决此此博客条目指定的父:

http://www.alfajango.com/blog/the-difference-between-jquerys-bind-live-and-delegate/