深入理解DOM事件机制系列第一篇——事件流

来源:互联网 发布:淘宝干衣机哪个品牌好 编辑:程序博客网 时间:2024/06/04 18:21

前面的话

  javascript操作CSS称为脚本化CSS,而javascript与HTML的交互是通过事件实现的。事件就是文档或浏览器窗口中发生的一些特定的交互瞬间,而事件流(又叫事件传播)描述的是从页面中接收事件的顺序。本文将详细介绍该部分的内容

 

历史

  当浏览器发展到第四代时(IE4及Netscape4),浏览器开发团队遇到了一个很有意思的问题:页面的哪一部分会拥有某个特定的事件?想象画在一张纸上的一组同心圆。如果把手指放在圆心上,那么手指指向的不是一个圆,而是纸上的所有圆

  两家公司的浏览器开发团队在看待浏览器事件方面还是一致的。如果单击了某个按钮,他们都认为单击事件不仅仅发生在按钮上,甚至也单击了整个页面

  但有意思的是,IE和Netscape开发团队居然提出了差不多是完全相反的事件流的概念。IE的事件流是事件冒泡流,而Netscape的事件流是事件捕获流

 

事件冒泡

  IE的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)

  以下列HTML结构为例,说明事件冒泡、事件捕获及事件流

复制代码
<!DOCTYPE HTML><html lang="en"><head><meta charset="UTF-8"><title>Document</title><body><div></div></body>    </html>
复制代码

  如果单击了页面中的<div>元素,那么这个click事件沿DOM树向上传播,在每一级节点上都会发生,按照如下顺序传播:

(1)    <div>(2)    <body>(3)    <html>(4)    document

  [注意]所有现代浏览器都支持事件冒泡,但在具体实现在还是有一些差别。IE9、Firefox、Chrome、Safari将事件一直冒泡到window对象

(1)    <div>(2)    <body>(3)    <html>(4)    document(5)    window
复制代码
<!DOCTYPE HTML><html lang="en"><head><meta charset="UTF-8"><title>Document</title><body><div id="box" style="height:100px;width:300px;background-color:pink;"></div><button id="reset">还原</button><script>//IE8-浏览器返回div body html document//其他浏览器返回div body html document windowreset.onclick = function(){history.go();}box.onclick = function(){box.innerHTML += 'div\n';}document.body.onclick = function(){box.innerHTML += 'body\n';}document.documentElement.onclick = function(){box.innerHTML += 'html\n';}document.onclick = function(){box.innerHTML += 'document\n';}window.onclick = function(){box.innerHTML += 'window\n';}</script></body>    </html>
复制代码

事件捕获

  事件捕获的思想是不太具体的节点应该更早接收到事件,而最具体的节点应该最后接收到事件。事件捕获的用意在于在事件到达预定目标之前就捕获它

  以同样的HTML结构为例,说明事件捕获

复制代码
<!DOCTYPE HTML><html lang="en"><head><meta charset="UTF-8"><title>Document</title><body><div></div></body>    </html>
复制代码

  在事件捕获过程中,document对象首先接收到click事件,然后事件沿DOM树依次向下,一直传播到事件的实际目标,即<div>元素

(1)    document(2)    <html>(3)    <body>(4)    <div>

  [注意]IE9、Firefox、Chrome、Safari等现代浏览器都支持事件捕获,但是从window对象开始捕获

(1)    window(2)    document(3)    <html>(4)    <body>(5)    <div>

  addEventListener()方法中的第三个参数设置为true时,即为事件捕获阶段

复制代码
<!DOCTYPE HTML><html lang="en"><head><meta charset="UTF-8"><title>Document</title><body><div id="box" style="height:100px;width:300px;background-color:pink;"></div><button id="reset">还原</button><script>//IE8-浏览器不支持//其他浏览器返回window document html body divreset.onclick = function(){history.go();}box.addEventListener('click',function(){box.innerHTML += 'div\n'},true)document.body.addEventListener('click',function(){box.innerHTML += 'body\n';},true);document.documentElement.addEventListener('click',function(){box.innerHTML += 'html\n';},true);document.addEventListener('click',function(){box.innerHTML += 'document\n';},true);window.addEventListener('click',function(){box.innerHTML += 'window\n';},true);</script></body>    </html>
复制代码

事件流

  事件流又称为事件传播,DOM2级事件规定的事件流包括三个阶段:事件捕获阶段(capture phase)、处于目标阶段(target phase)和事件冒泡阶段(bubbling phase)

  首先发生的是事件捕获,为截获事件提供了机会。然后是实际的目标接收到事件,最后一个阶段是冒泡阶段,可以在这个阶段对事件做出响应

转载地址:http://www.cnblogs.com/xiaohuochai/p/5859476.html
阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 8个月孕妇咳嗽怎么办 孕妇7个月咳嗽怎么办 孕妇6个月喉咙痒怎么办 怀孕了咳嗽的厉害怎么办 买衣服眼光太差怎么办 我买衣服没主见怎么办 海澜之家皮带长怎么办 针织衫袖口松了怎么办 宝宝裤子腰大了怎么办 两岁了头发稀少怎么办 孩子抵抗力差爱生病怎么办 三岁宝宝总生病怎么办 冬天穿伴娘服冷怎么办 白衬衣粘了黑毛怎么办 黄衣服钻进黑毛怎么办 单位没给上社保怎么办 轮毂中心孔大了怎么办 钻戒大了怎么办小窍门 shift加f4没反应怎么办 多洗联系不上怎么办 弹力靴筒往下掉怎么办 子宫内膜厚月经停不了怎么办 雪纺衣服有静电怎么办 阿胶糕熬的稀了怎么办 感冒吃了阿胶糕怎么办 身上起湿疹很痒怎么办 身上起小疹子痒怎么办 吊带裙带子断了怎么办 裙子洗完缩水了怎么办 衬衫洗后缩水了怎么办 羊毛被洗缩水了怎么办 蕾丝洗后缩水了怎么办 天丝针织衫缩水怎么办? 氨纶面料起球怎么办? 新买的衬衫很硬怎么办 孕晚期睡不好觉怎么办 全棉衣服缩水了怎么办 棉麻的衣服起球怎么办 布艺沙发起球怎么办 加绒的衣服掉毛怎么办 新裤子有刺鼻味怎么办