`

深入理解IE事件模型与DOM事件模型

阅读更多
来源:http://qiqicartoon.com/?p=816
事件模型对于javascript程序员来说太重要了!如果你的javascript中找不到attahEvent或addEventListener的话,那我觉得真的有点太荒唐了(某些项目应该没有事件驱动)。
毫无疑问深入理解事件模型将使你的工作事半功倍!
其实理解事件模型倒也不是很困难,困难之处在于事件模型之前的兼容性!说到这里不得不提起讨厌的IE和喜爱的DOM。
我们知道IE内核的浏览器,它的事件模型是冒泡型事件,也就是说在IE内核下事件句柄的触发顺序是从ChildNode到ParentNode。
1 <div id="ancestor">
2       <button id="child">
3           Open the console and click me
4       </button>
5   </div>

以上的HTML代码在IE内核下,事件是这样传播的:
1、Button#child;
2、div#ancestor;
3、Body;
4、Document
切记!IE的内核是没有捕获事件过程的
那么在DOM标准的浏览器,事件传播的过程又是怎样的呢?我们依然拿上面的HTML代码做例子,在DOM标准的浏览器事件是这样传播的:
1、Window
2、Document
3、Body
4、Div#ancestor
5、Button#child

Bubble

6、Div#ancestor
7、Body
8、Document
9、Window
在DOM标准的浏览器中多了一个事件捕获过程,也就是说当开发者在一个无素上注册了事件后,这个事件的响应顺序是从window(最顶层)开始一级一级的向下传播,然后到了该元素后事件捕获过程结束,事件开如冒泡,一级一级向父层元素冒泡(请注意第6步)。当然了开发者可以很轻松的决定DOM标准的浏览器中的事件需要在哪个传播过程触发这。就需要谈一下事件的注册机制了。
DOM标准的浏览器事件注册方法是通过addEventListener方法注册,而IE内核的浏览器则是通过attachEvent方法注册。
这两个方法的区别,我在此简单的介绍下,若不太明白,可以自行去搜索相关资料。
addEventListener方法带有三个参数,分别是:eventType、handler、useCapture。
eventType不带有on字符串;
handler参数是一个事件句柄,这个函数或方法带有一个事件对象参数;
useCapture参数决定了事件句柄触发在哪种事件传播阶段,如果useCapture为true则为捕获阶段,反之则为冒泡阶段。
是不是还是不太理解捕获阶段和冒泡阶段,不用怕,看以下代码的演示:
我们依然用以上的HTML代码片段
1 var ancestorHandler = function (e){
2   //......
3 },
4 childHandler = function (e){
5   //......
6 };
7 document.querySelector('#ancestor').addEventListener('click',ancestorHandler,false);//注意第三个参数
8 document.querySelector('#child').addEventListener('click',childHandler,true);//注意第三个参数

以上代码我们为div节点注册了一个在冒泡阶段触发的事件句柄,为按钮节点注册了一个在捕获阶段的事件句柄,请注意DIV是按钮的父层。
当用户在这个DIV元素上点击时,事件的执行顺序是childHandler、ancestorHandler。
为什么会是这样呢?这是因为按钮的事件是在捕获阶段触发的,也就是从上到下,而DIV的事件是注册在冒泡阶段,也就是点击了这个按钮开始从这个按钮的位置往上冒泡。
当然了,我们可以阻止事件的冒泡,DOM事件对象提供了stopPropagation方法用于阻止事件流。
1 var ancestorHandler = function (e){
2   //......
3 },
4 childHandler = function (e){
5   e.stopPropagation();
6   //......
7 };


以上代码中我们在childHandler函数中添加了e.stopPropagation()代码片段,它将阻止事件流,事件流包括捕获阶段及冒泡阶段的事件流。
我们再修改上面的代码如下:
1 var ancestorHandler = function (e){
2   //......
3 },
4 childHandler = function (e){
5   //......
6 };
7 document.querySelector('#ancestor').addEventListener('click',ancestorHandler,true);//注意第三个参数
8 document.querySelector('#child').addEventListener('click',childHandler,true);//注意第三个参数

以上的代码产生的结果是:用户在DIV元素上单击时,将会依次触发ancestorHandler、childHandler函数,为什么?因为我们将div#ancestor的事件注册到捕获阶段了,也就是从上至下。当然了我们还可以阻止childHandler方法的执行。
1 var ancestorHandler = function (e){
2   e.stopPropagation();
3   //......
4 },
5 childHandler = function (e){
6   //......
7 };

以上代码将阻止按钮的事件触发。当用户点击了DIV的区域,仅仅触发ancestorHandler函数,因为我们阻止了事件流。
接下来我们看看在IE内核的浏览器中是如何注册事件的。IE内核提供了attachEvent方法为元素注册事件,注意该方法与DOM的addEventListener方法区别很大!该方法带有两个参数,
eventType 事件类型,请注意这个参数与addEventListener的eventType的区别,它必须带有on;
handler 事件句柄
请注意attachEvent没有提供事件捕获阶段的参数,IE内核的事件都是发生在冒泡阶段!
1 var ancestorHandler = function (e){
2   //......
3 },
4 childHandler = function (e){
5   //......
6 };
7 document.getElementById('ancestor').attachEvent('onclick',ancestorHandler);//注意没有第三个参数
8 document.getElementById('child').attachEvent('onclick',childHandler);//注意没有第三个参数

以上代码在IE中将为DIV元素和按钮元素注册了不同的事件。
另外还有一些注意事项:
1、DOM标准的addEventListener方法执行事件的顺序是按照事件注册的顺序执行的。而attachEvent方法则相反–后注册的事件先觖发,先注册的事件后触发。
2、DOM标准的浏览器文本节点也会冒泡,而IE内核的浏览器文本节点不会冒泡。
3、DOM标准的浏览器事件对象与IE内核的浏览器事件不同(具体请参阅http://www.quirksmode.org/js/introevents.html)。
4、DOM标准的浏览器事件卸载方式与IE内核的事件卸载方式不同。
1 object.removeEventListener(eventType,handler,useCapture);//DOM标准的事件卸载方式
2 object.detachEvent(eventType,handler);//IE内核的事件卸载方式

在DOM标准的事件卸载方式中需要注意的是:事件捕获的参数。如果你的事件是注册在捕获阶段,则卸载事件时,必须将其指定为捕获阶段(true),否则无法卸载;如果你的事件注册在注册在冒泡阶段,则必须将其指定为冒泡阶段(false),否则同样无法卸载!
分享到:
评论

相关推荐

    Javascript Event事件中IE与标准DOM的比较

    冒泡型事件模型: button-&gt;div-&gt;body (IE事件流) 捕获型事件模型: body-&gt;div-&gt;button (Netscape事件流) DOM事件模型: body-&gt;div-&gt;button-&gt;button-&gt;div-&gt;body (先捕获后冒泡) 2.事件侦听函数的区别 IE使用: ...

    javascript事件捕获机制【深入分析IE和DOM中的事件模型】

    主要介绍了javascript事件捕获机制,结合实例形式分析了冒泡的原理、事件捕获、各浏览器事件处理机制与IE和DOM中的事件模型等,需要的朋友可以参考下

    深入理解jQuery 事件处理

    浏览器的事件模型 DOM第0级事件模型 1.Event实例 他的属性提供了关于当前正被处理的已触发事件的大量信息。这包括一些细节,比如在哪个元素上触发的事件、鼠标事件的坐标以及...IE事件模型 jQuery事件模型 使用jQue

    dominspector-IE下的DOM查看器

    IE下的DOM查看器,可以方便的查看文档模型结果,相当的好用,没有任何限制

    javascript事件模型实例分析

    捕获型事件(Capturing):由DOM树最顶元素一直到最精确的元素,与冒泡型事件相反 DOM标准事件模型:DOM标准既支持冒泡型事件,也支持捕获型事件,可以说是两者的结合体,首先是捕获型,接着冒泡传递 二、事件对象 ...

    ie 开发 调试 工具 三合一 companionjs debugbar(5.2) Internet.Explorer.Developer.Toolbar 天涯浪子

    该产品让开发人员能够深入探索和理解Web页面,帮助开发者更好地创建Web应用.安装后可以在IE中快速分析网页的软件.该工具条可集成在IE窗口,或以浮动窗口形式存在. IE Developer Toolbar特性如下: -浏览和修改Web页的...

    javascript事件模型介绍

    在各种浏览器中存在三种事件模型:原始事件模型( original event model),DOM2事件模型,IE事件模型.其中原始的事件模型被所有浏览器所支持,而DOM2中所定义的事件模型目前被除了IE以外的所有主流浏览器支持。

    有关DOM元素与事件的3个谜题

    一、背景知识介绍 通常为DOM元素增加事件有以下几种... 2,事件监听机制,这种形式采用的做法是根据DOM事件机制,分为DOM标准事件模型addEventListener和IE事件模型attchEvent。 代码类似如下: 代码如下: var addEve

    IE6升级到IE9兼容性问题和操作手册

    1. 方框模型溢出内容现与方框相交,不再让方框自动增长适应内容。 9 2. 不再支持某些 CSS 筛选器(如 *HTML、_underscore 和 /**/ 注释)。 11 3. 已解决SELECT 元素不能被div覆盖的问题。 14 第二节:IE7-IE8更新 ...

    IE Dev Toolbar 中文版

    该产品让开发人员能够深入探索和理解Web页面,帮助开发者更好地创建Web应用.安装后可以在IE中快速分析网页的软件.该工具条可集成在IE窗口,或以浮动窗口形式存在. IE Developer Toolbar特性如下: -浏览和修改Web页的...

    IE Developer Toolbar

     -浏览和修改Web页的文档对象模型(DOM).  -通过多种技术方式定位、选定Web页上的特定元素.  -禁止或激活IE设置.  -查看HTML对象的类名、ID,以及类似链接路径、tab顺序、快捷键等细节.  -描绘表格...

    Javascript拖拽拖放系列文章3之细说事件对象第1/4页

    在阅读本文前,可以先阅读《Javascript拖拽&拖放系列文章2之offsetLeft、offsetTop、offsetWidth、offsetHeight属性》这篇文章,以理清... 3.1 e/window.Event对象的属性/方法 3.1.1 IE事件模型和DOM事件如下: 0-未按

    JavaScript 事件入门知识

    JavaScript事件是由访问Web页面的用户引起的一系列操作; ...当用户执行某些操作的时候,再去执行一系列代码; 一 事件介绍 ... JavaScript有三种事件模型:内联模型/脚本模型和DOM2模型; 二 内联模型(HT

    DOM 事件流详解

    浏览器的事件模型分两种:捕获型事件和冒泡型事件。由于ie不支持捕获型事件,所以以下主要以冒泡型事件作为讲解。 (dubbed bubbling)冒泡型指事件安装最特定的事件到最不特定的事件逐一触发。 代码如下:  &lt;...

    纯JavaScript实现的兼容各浏览器的添加和移除事件封装

    //事件处理兼容各种浏览器,采用能力检测方法,所谓能力检测,就是... //非IE浏览器采用dom2级事件处理,type为事件类型如:click,handler为事件处理函数,false代表事件采用冒泡处理模型,如果是true代表 采用捕获型

    javascript下对于事件、事件流、事件触发的顺序随便说说

    1.首先我们来了解几个概念,“事件”,“事件流”,“事件名称”,“事件...下面我们来了解一下历史,事件是dom的一部分 是在版本3中已经得到完整的说明,当进浏览器除ie(它有自己的事件模型),其他像netscape,safar

    JavaScript 事件绑定及深入

    一种是现代事件绑定(DOM2级模型);现代事件绑定在传统事件绑定基础上提供了更强大的功能; 一 传统事件绑定的问题 // 脚本模型将一个函数赋值给一个事件处理函数; var box = document.getElementById('box'); // ...

    IEDevToolBar V1.00.2188.0

    该产品让开发人员能够深入探索和理解Web页面,帮助开发者更好地创建Web应用.安装后可以在IE中快速分析网页的软件.该工具条可集成在IE窗口,或以浮动窗口形式存在. IE Developer Toolbar特性如下: -浏览和修改Web页的...

    javascript完全学习手册2 源码

    10.4 IE事件模型 10.4.1 IEEvent对象 10.4.2 IE的事件传播 10.5 常用事件 10.5.1 鼠标事件 10.5.2 键盘事件 10.5.3 表单事件 10.5.4 编辑事件 10.5.5 页面事件 第11章 使用Cookie和文件 11.1 ...

Global site tag (gtag.js) - Google Analytics