Johnny_Z

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

jQuery中的事件传播也即是javascript中的事件传播。

事件传播分为两个阶段,一个是Capture(捕获)阶段,另一个是Bubble(冒泡)阶段。

下面就分别讲一下这两个阶段。先用一张图来总体表示一下:

clip_image002

比如说,我们点击了页面上id为picture的img元素,暂时只关心click事件,那么实际上它是从根元素html依次递归到点击的元素,这里为img元素,当然如果点击到了id为son的div元素,它就会递归到该div元素,这一阶段称为捕获阶段。该阶段中如果有任何祖先元素监听了click事件,那么都会触发该事件。

那么,从点击到的img元素开始,依次向祖先元素递归,一直到达顶级祖先元素,这一过程称为冒泡阶段。该阶段中,如果有任何祖先元素监听了click事件,也会触发。

我们也可以概括为捕获阶段是从祖先元素(根节点)到达目标元素;冒泡阶段是从目标元素到达祖先元素(根)。

明白了这一过程后,我们来看一段代码:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
  $('*').each(function () {
    var current = this;
    this.addEventListener('click', function (event) {
      say('捕获' + current.tagName + '元素,id为' + current.id + ',目标元素:' + event.target.id);
    }, true);
    this.addEventListener('click', function (event) {
      say('冒泡' + current.tagName + '元素,id为' + current.id + ',目标元素:' + event.target.id);
    }, false);
  })
});
function say(text) {
  $('#show').append('<div>' + text + '</div>');
}
</script>
</head>
<body>
<div id='father'>
  <div id='son'>
    <img id="flower" alt="" src="images/Tulips.jpg" width="300px" height="200px" />
  </div>
</div>
<div id="show">
</div>
</body>
</html>

代码中使用了addEventListener方法为元素注册事件。该方法的第一个参数为事件类型,第二个参数为回调方法,第三个参数为在哪一个阶段捕获事件,若为true则是捕获阶段,若为false则是冒泡阶段。运行结果:

clip_image003

如果我们想在冒泡阶段阻止事件向祖先元素传播,我们也可以调用Event实例中的stopPropagation()方法。

Demo下载

posted on 2012-06-17 14:03  Johnny_Z  阅读(5692)  评论(0编辑  收藏  举报