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


Posted in Javascript onJuly 17, 2010

1.首先我们来了解几个概念,“事件”,“事件流”,“事件名称”,“事件处理函数/事件监听函数,也许是“老生常谈”,知道的朋友可以越过。

事件: 事件是用户自身或浏览器进行的特定行为。如:用户点击 也就是常用的click事件
事件流:多个事件 按一定顺序触发 形成了事件流
事件名称:如上面所讲的click就是事件名
事件处理函数/事件监听函数(Dom的叫法)就是 事件触发后的处理函数,如obj.onclick=fn;函数fn就是事件处理函数

2.下面我们来了解一下历史,事件是dom的一部分 是在版本3中已经得到完整的说明,当进浏览器除ie(它有自己的事件模型),其他像netscape,safari,opera都基本上遵守dom的事件模型

3. 冒泡事件,其基本思想是事件从特定的事件目标向非特定的事件目标顺序触发。

先看如下代码:代码

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html;charset=gb2312" /> 
<title>无标题页</title> 
</head> 
<body onclick="handleClick()"> 
<div onclick="handleClick()">click me</div> 
</body> 
</html>

在ie5.5其冒泡顺序如下图

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

在ie6.o以上增加了html(为了兼容,最后避免在此标签上添加事件) 如图:

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

而在Mozilla 1.0中的冒泡事件是:

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

 

三种其实顺序没什么不同,只是有部分标签是否支持冒泡的差异

4.我们再看 捕获事件

   ie4.0使用的是冒泡事件,而netscape navigator使用的是捕获型事件如下图所示:

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

5.ie只支持冒泡事件,而dom是同时支持“ 冒泡事件和捕获事件的 ”,顺序是:”捕获事件”-----》》“冒泡事件” ,前面我们已经讲了moz,opera,safari等浏览器基本上是符合dom事件模型的,所以他们也支持“ 冒泡事件和捕获事件的 ”,如下图:

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

 

 

 6.下面我们了解  怎样为标签添加事件,最常用的方法是在其标签里面添加如 一下代码(这种添加,在moz中只有“捕获事件”,等价于用addEventListener(obj,type,false)添加的函数,这个后面再讲):

       例如:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>无标题页</title> 
</head> 
<body onclick="alert('body')"> 
<div onclick="alert('div');"> 
div 
<input id="Button1" onclick="alert('btn');" type="button" value="button" /> 
</div> 
</body> 
</html>

点击 按钮 在ie中,依据我们对上面的了解,很容易写出答案了,没错!ie只有冒泡事件 所以 顺序为:button>>div>>body;
而在非ie浏览器如moz中 正如我们上面所说的 内嵌式事件 等价于addEventlistener(type,fn,false) 只从捕获事件中 监听。
所以顺序刚好相反 body>>div>>body;

在addEventlistener(type,fn,true添加事件时) 只监听 “捕获事件” 当第三个参数为false时 只监听 冒泡事件
我们看下面一个例子:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html;charset=gb2312" /> 
<title>无标题页</title> 
<style type="text/css"> 
#ll{ background:#f00; _width: expression(this.width>200?"200px":true);} 
</style> 
</head> 
<body id="obj1"> 
<div id="obj2"><input id="obj3" id="Text1" type="text" /></div> 
<script language="javascript" type="text/javascript"> 
var $=function(eid){ 
return typeof eid=="object"?eid:document.getElementById(eid); 
}; 
var fn={ 
fn1:function(){alert("body");}, 
fn2:function(){alert("div");}, 
fn3:function(){alert("test");} 
}; 
var et={}; 
et.addEvent=function(obj,type,fn,flag){ 
if(obj.attachEvent){ 
obj.attachEvent("on"+type,fn); 
}else if(obj.addEventListener){ 
flag=(typeof flag!="undefined")?flag:true; 
obj.addEventListener(type,fn,flag); 
}else{ 
obj["on"+type]=fn; 
} 
}; 
et.addEvent($("obj1"),"click",fn.fn1,true); 
et.addEvent($("obj2"),"click",fn.fn2,false); 
et.addEvent($("obj3"),"click",fn.fn3,true); 
// et.addEvent($("obj3"),"click",fn.fn3); 
// et.addEvent($("obj2"),"click",fn.fn2); 
// et.addEvent($("obj1"),"click",fn.fn1); 
</script> 
</body> 
</html>

点击文本域,猜一猜分别在ie和moz(火狐)中的区别,当然在ie中由于 只监听 冒泡事件 所以很好判断 执行顺序为:input>>div>>body
而在moz中 由于div在添加事件时 第三个参数为false 说明div只 监听 冒泡事件,然后我们根据dom的事件 模型 不难判断,先是ojb1>>obj3>>obj2
分别弹出 body>> test >>div
顺便唠叨一下:向同一个标签 动态的添加事件是 执行的顺序在ie和其他非ie内核的浏览器有所不同 ie是“先进先出 ” 就是最先添加的最先执行,其他非ie内核的浏览器是 “先进后出”,就是 最后添加的事件 先执行。
Javascript 相关文章推荐
jQuery之折叠面板的深入解析
Jun 19 Javascript
js获取GridView中行数据的两种方法 分享
Jul 13 Javascript
判断一个变量是数组Array类型的方法
Sep 16 Javascript
用循环或if语句从json中取数据示例
Aug 18 Javascript
js+HTML5实现视频截图的方法
Jun 16 Javascript
浅谈jquery.form.js的ajaxSubmit和ajaxForm的使用
Sep 09 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
Mar 03 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
Oct 31 Javascript
js中的reduce()函数讲解
Jan 18 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
Dec 09 Javascript
angular中的post请求处理示例详解
Jun 30 Javascript
vue-resource 拦截器interceptors使用详解
Jan 18 Vue.js
jQuery Select(单选) 模拟插件 V1.3.62 改进版
Jul 17 #Javascript
基于jquery的Repeater实现代码
Jul 17 #Javascript
javascript onmouseout 解决办法
Jul 17 #Javascript
javascript 从if else 到 switch case 再到抽象
Jul 17 #Javascript
用JavaScript对JSON进行模式匹配 (Part 2 - 实现)
Jul 17 #Javascript
用JavaScript对JSON进行模式匹配(Part 1-设计)
Jul 17 #Javascript
关于flash遮盖div浮动层的解决方法
Jul 17 #Javascript
You might like
php不用正则采集速度探究总结
2008/03/24 PHP
用php的ob_start来生成静态页面的方法分析
2011/03/09 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
laravel 多图上传及图片的存储例子
2019/10/14 PHP
ajax 缓存 问题 requestheader
2010/08/01 Javascript
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
2010/12/28 Javascript
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
C++中的string类的用法小结
2015/08/07 Javascript
JQuery自适应窗口大小导航菜单附源码下载
2015/09/01 Javascript
jquery验证手机号是否正确实例讲解
2015/11/17 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
2015/11/17 Javascript
javascript创建cookie、读取cookie
2016/03/31 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
2016/07/01 Javascript
jQuery对table表格进行增删改查
2020/12/22 Javascript
Bootstrap栅格系统简单实现代码
2017/03/06 Javascript
详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
2017/05/22 Javascript
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
详解webpack性能优化——DLL
2017/10/20 Javascript
Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
2018/05/16 Javascript
clipboard在vue中的使用的方法示例
2018/10/19 Javascript
解决vue打包后刷新页面报错:Unexpected token
2019/08/27 Javascript
在weex中愉快的使用scss的方法步骤
2020/01/02 Javascript
angular中的post请求处理示例详解
2020/06/30 Javascript
python实现聊天小程序
2018/03/13 Python
TensorFLow 数学运算的示例代码
2020/04/21 Python
Python爬取网页信息的示例
2020/09/24 Python
纯css3制作网站后台管理面板
2014/12/30 HTML / CSS
HTML5 的新的表单元素(datalist/keygen/output)使用介绍
2013/07/19 HTML / CSS
介绍一下EJB的分类及其各自的功能及应用
2016/08/23 面试题
农村门前三包责任书
2014/07/25 职场文书
2015年共青团工作总结
2015/05/15 职场文书
立案决定书范文
2015/06/24 职场文书
vue3中的组件间通信
2021/03/31 Vue.js
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python
python如何查找列表中元素的位置
2022/05/30 Python