`

DOM 事件模型在各个浏览器中差异

阅读更多

     网上搜“DOM事件模型”,文章非常多,在此写下仅仅是看到的那些文章的汇总,有错误欢迎指正。

 

     关于DOM事件模型图就不发鸟,网上很多,而且比较简单,这里说明一些关于DOM事件模型在各个浏览器中一些差异之处。

 

   DOM的事件分为两种:一个是捕捉性事件,一个是冒泡型事件,

 

  1,addEventListner (el,"click",true);第三个参数如果是true的话, 就是声明为捕捉事件处理。则在事件下发的时候,会发生祖先元素对事件进行处理。在firefox2和safari9里面是如此,而在opera里面并不会如此。

     这是因为firefox2和safari9并不是遵循DOM规范的,

     规范中这么说明:

        A capturing EventListener will not be triggered by events dispatched directly to the EventTarget upon which it is registered.

     大意是说:DOM规范中陈述了捕捉型的事件不应该在目标元素上被执行,因为捕捉型事件的用意就是为了监测到达目标元素之前的事件。

 

    在整个事件传播中,被执行的顺序是:
   1. 父元素中所有的捕捉型事件自上而下地执行 捕捉性事件。
   2. 目标元素的冒泡型事件  而firefox里面会进行捕捉型事件处理,而opera里面不会
   3. 父元素中所有的冒泡型事件自下而上地执行  。    

 

2,IE里面的事件模型:

   IE下没有addEventListener,但是也有自己的attachEvent,即所谓的Microsoft Model。二者的实现基本相同只是attachEvent的第一个参数(事件类型)需要加”on”,而addEventListener不用,另外attachEvent因为不支持事件捕捉,所以也没有第三个参数。

然而,attachEvent还有一个很要命的问题:重复绑定事件。
IE上可以对该元素的事件进行多次同样的绑定。这也算是比较不好的地方。而其他浏览器则会在重复绑定的时候,检测而后只绑定一次。同理在detachEvent的时候。(有待验证)

  •  IE事件模型只起泡,不捕捉。起泡中断方法:window.event.cancelBubble=true;
  •  Event对象不是事件处理程序的函数参数,而是window的全局变量。window.event;
  • 事件注册函数:attachEvent()和反注册:detachEvent().  重复绑定的情况下,也需要多次detachEvent

 
 在IE中使用event.cancelBubble = true; 来取消事件冒泡, 在Firefox中用stopPropagation()方法来停止事件冒泡, 即不要让别的元素看到该事件。 IE中关于event的获取是从window.event的方式获取,其目标通过event.srcElement 而firefox则使用event.target  。

 

3,Firefox中的onchang事件与IE中onchange事件、onpropertychange事件:

  • 对于checkbox、 input type="file"等元素,在Firefox中只要元素的内容一发生变化就触发onchang事件,而在IE中需等到元素失去焦点才触发 onchang事件;对于input type="text",FF和IE下一样,都是失去焦点之后才触发onchang事件。
  • IE中当元素的属性值或内容一发生变化(含JavaScript操作)就激发onpropertychange事件,Firefox无此事件。

关于事件类型 各个浏览器的支持程度:下面网址大部分都涵盖了:

 

     http://www.quirksmode.org/dom/events/   

 

 

 

 

分享到:
评论
3 楼 ember_319 2012-03-17  
在onclick里实现本来应该在onchange中做的事儿,这样IE工作的不错。不过需要增加自己的判断
2 楼 ember_319 2012-03-17  
这个IE的onChange真是麻烦,我试了好几个浏览器,就它跟大家不一样
1 楼 libmw 2010-11-25  
感谢分享……看到事件就蛋疼

相关推荐

    事件模型在各浏览器中存在差异

    DOM 2 Events 中定义了 Event 接口,用来提供事件的上下文信息,它提供了若干标准属性和方法。 实现 Event 接口的对象一般作为第一个参数传入事件处理函数,以用来提供当前事件相关的一些信息。 DOM 2 事件模型允许...

    JavaScript王者归来part.1 总数2

     12.2.4 差异性--浏览器的DOM方言   12.3 一组“盒子”--DOM元素   12.3.1 嵌套的“盒子”   12.3.2 “盒子”和“盒子”内容的分类   12.4 创建和删除节点   12.4.1 构造全新的节点   12.4.2 平面展开-...

    前端开发常见问题汇总概要总结.docx

    布局与样式兼容性:不同浏览器对CSS标准支持程度各异,导致布局差异,需要处理盒模型、float、positioning、flexbox、grid等方面的兼容问题。 响应式设计:移动设备适配、屏幕分辨率变化下的布局调整和图像自适应等...

    java百度贴吧登陆源码-front-end-interview-questions:在里面

    对Web标准的理解、浏览器内核差异、兼容性、hack、CSS基本功:布局、盒子模型、选择器优先级、 HTML5、CSS3、Flexbox JavaScript: 数据类型、运算、对象、Function、继承、闭包、作用域、原型链、事件、RegExp、...

    响应式开发HTML重组库Intention.js.zip

    Intention.js和Context.js,Intention.js库主要是用来管理响应轴以及基 于元素规格和事件改变来操纵元素,Context.js是Intention.js的一个实现,在进行响应式设计时提供一组通用的使用模型。 Intention.js有三个...

    vgtk:基于GTK和Gtk-rs构建的Rust声明性桌面UI框架

    使用的事件循环在Rust的的基础上构建,从而为您提供与GTK事件模型完美集成的。 除非您嵌入式浏览器引擎,否则绝对不需要。 文献资料 给我看看! use vgtk :: {ext :: * , gtk, run, Component, UpdateAction, ...

    tictactoe:这是一个网格游戏

    里程碑3:网格游戏学习能力在这个里程碑的结尾,您将学到解决问题建立网页为网页游戏创建高效的动画使用文档对象模型(DOM)处理文档结构将应用程序数据存储在客户端数据库中使用服务器并通过对其进行操作来获取数据...

    CssTraining:在学习CSS期间,需要注意的事项

    显示:%30 CSS用户代理:浏览器中存在某些差异 语义标签:SEO-h1查看标题等主题。 在头部写css <style>的方法 选择器-选择器类型选择器-元素名称通用*类id属性[] 设计博客-字体和功能 表单元素-请勿在所有...

    java 面试题 总结

    在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...

    超级有影响力霸气的Java面试题大全文档

    在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...

    AJAX 源码范例

    12/12.3/ 示例:实现Ajax翻页效果 <br>第13章 13/13.1.5.html DOM中事件顺序模型的不同范例 13/13.1.6.html CSS中使用!important提高属性优先级范例 13/13.2.2.html 利用URL存储状态信息...

    MEAN-Basic-Tutorial:MEAN 堆栈教程

    不同的浏览器实现的功能不同,但 AJ 的指令(或 HTML 扩展)会处理差异全局命名空间:表达式和方法定义在控制器范围内,因此它们不会污染全局命名空间。 数据模型是普通的旧 Javascript 对象。 AJ 提供了编写模块化...

    Tinyxml 源代码(VC6 & VS2005)

    TinyXML使用文档对象模型(DOM),这意味着XML数据被解析成一个可被浏览和操作的C++对象,然后它可以被写到磁盘或者另一个输出流中。你也可以把C++对象构造成一个XML文档然后把它写到磁盘或者另一个输出流中。 ...

    JAVA面试题最全集

    简述java编程中事件处理模式。 30.你编写过applet吗?applet的安全权限如何?试列举java application或者applet中与servlet/jsp通信可以采用的方式。 31.简述逻辑操作(如&,|)与条件操作(如&&,||)的区别。 32....

Global site tag (gtag.js) - Google Analytics