Javascript中的事件传播

时间:2009-10-05 23:39:22

标签: javascript jquery events event-propagation

如果我有一个嵌套在另一个元素中的元素(html)并且它们都附加了一个单击处理程序,则单击内部元素执行其单击处理程序,然后冒泡到父级并执行其单击处理程序。这就是我理解的方式。

如果没有附加的事件是相同的,事件会冒泡到DOM树吗?如果是这样,是否值得在每个处理程序的末尾放置一个event.stopPropagation()来阻止它并加快速度?

2 个答案:

答案 0 :(得分:16)

除非设置了event.cancelBubble = true或者使用了event.stopPropagation(),否则

事件几乎总是冒泡。但是,当你的一个活动时,你才会意识到这一点 处理程序被绊倒。

请参阅http://en.wikipedia.org/wiki/DOM_events以查看冒泡的事件列表。 (注意:在HTML事件表中,cancelable指的是event.preventDefault()的有效性,或者返回false来取消默认操作,而不是冒泡)

另见http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow,特别是1.2.1基本流程,以了解事件传播的捕获阶段和冒泡阶段。

修改

http://mark-story.com/posts/view/speed-up-javascript-event-handling-with-event-delegation-and-bubbling建议 通过停止传播来提高性能,但不提供任何数据。

http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/a9af0aa4216a8046建议浏览器应针对冒泡行为进行优化,并表示应该没有明显的性能差异。再没有数据。

http://developer.yahoo.com/performance/rules.html#events提供了一种改善事件处理性能的好方法,但没有直接讨论stopPropagation性能。

最终,您必须分析差异,以便更好地了解您网站的优势。

答案 1 :(得分:1)

我认为这种行为已经被浏览器很好地优化了,因此在停止传播时你将无法获得显着的性能提升(可能除了真正非常复杂的嵌套DOM结构)。如果您担心表演并处理大量活动,您可能会对活动委派感兴趣。

此外,您应该记住您的代码应该保持可读性和自我解释。 stopPropagation()是一种用于特定目的的方法,因此在每种方法中使用它可能会让人感到困惑。