js事件流

参考事件流解析

参考讲解清楚明白的事件流

事件流包含三个阶段:

1. 事件捕获

2. 事件目标

3. 事件冒泡

elementObj.addEventListener(type,  handle, iscaptrue)

iscaptrue为true代表捕获阶段,为false是冒泡阶段。默认是冒泡

1)、所有现代浏览器都支持事件冒泡,但在具体实现中略有差别:

IE5.5及更早版本中事件冒泡会跳过<html>元素(从body直接跳到document)。

IE9、Firefox、Chrome、和Safari则将事件一直冒泡到window对象。

2)、IE9、Firefox、Chrome、Opera、和Safari都支持事件捕获。尽管DOM标准要求事件应该从document对象开始传播,但这些浏览器都是从window对象开始捕获事件的。

3)、由于老版本浏览器不支持,很少有人使用事件捕获。建议使用事件冒泡

DOM标准规定事件流包括三个阶段:事件捕获阶段、处于目标阶段和事件冒泡阶段。

  • 事件捕获阶段:实际目标(<div>)在捕获阶段不会接收事件。也就是在捕获阶段,事件从document到<html>再到<body>就停止了。上图中为1~3.
  • 处于目标阶段:事件在<div>上发生并处理。但是事件处理会被看成是冒泡阶段的一部分
  • 冒泡阶段:事件又传播回文档。

note:

1)、尽管“DOM2级事件”标准规范明确规定事件捕获阶段不会涉及事件目标,但是在IE9、Safari、Chrome、Firefox和Opera9.5及更高版本都会在捕获阶段触发事件对象上的事件。结果,就是有两次机会在目标对象上面操作事件。

2)、并非所有的事件都会经过冒泡阶段 。所有的事件都要经过捕获阶段和处于目标阶段,但是有些事件会跳过冒泡阶段:如,获得输入焦点的focus事件和失去输入焦点的blur事件。


这就是委托事件绑定: 
$(selector).delegate(childSelector,event,data,function) 
它是利用冒泡的原理,把事件加到父级上,触发执行效果。 
当你点击一个新增的标签时,原始加载的DOM结构是没有这个新增标签的,就也就是事件监听是与原始DOM结点进行绑定的。 
而你用delegate将要绑定的元素委托给其父元素,也就是当你点击新增元素时,其实响应的是其父元素(逐一向上冒泡,看哪个元素已经被绑定监听事件),而父元素会重新解析一下自己的DOM结构,这时候新增的元素标签就能被解析到了。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页