JavaScript 事件系统


Posted in Javascript onJuly 22, 2010

事件流
JavaScript 的事件是以一种流的形式存在的,一个事件会有多个元素同时响应。有时候这不是我们
想要的,我们只需要某个特定的元素响应我们的绑定事件就可以了。

事件分类
捕获型事件(非IE)、冒泡型事件(所有浏览器都支持)

捕获型事件是自上而下的,而冒泡型事件是自下而上的。下面我用一个图来直观表示:
JavaScript 事件系统
冒泡型事件我们在工作中可能会比较多遇到,但捕获型事件怎样才会执行到呢,如果我们想要在非 IE 浏览器中

要创建捕获型事件,只需将 addEventListener 的第三个参数设为true就好了。

例子如下:Link
JavaScript 事件系统
ID为div1和div2的两个元素都被绑定了捕捉阶段的事件处理函数,这样:
当点击#div1(蓝色区域)时,应该会alert出”div1″
当点击#div2(黄色区域)时,应该会先alert出”div1″,再alert出”div2″,因为在事件捕捉阶段,事件是从根元素向下传播的,#div1是#div2的父元素,自然绑定在#div1上的click事件也会先于#div2上的click事件被执行。
冒泡型事件例子:

<!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=utf-8" /> 
<title>冒泡事件</title> 
<script type="text/javascript"> 
var i = 1; 
function Add(sText,objText) 
{ 
document.getElementById("Console").innerHTML +=sText + "执行顺序:" + i + "<br />" + "<hr />"; 
i = i + 1; 
//window.event.cancelBubble = true; 
} 
</script> 
</head> 
<body onclick="Add('body事件触发<br />','body')"> 
<div onclick="Add('div事件触发<br />','div')"> 
<p onclick="Add('p事件触发<br />','p')" style="background:#c00;">点击</p> 
</div> 
<div id="Console" style="border:solid 1px #ee0; background:#ffc;"></div> 
</body> 
</html>

从这个例子我们可以很清楚的看到事件冒泡是从目标元素 P 一直上升到 body 元素。

阻止事件冒泡

如下有一个函数兼容了 IE 和其它浏览器的阻止事件冒泡

function stopBubble(e) { 
//如果提供了事件对象,则这是一个非IE浏览器 
if ( e && e.stopPropagation ) 
//因此它支持W3C的stopPropagation()方法 
e.stopPropagation(); 
else 
//否则,我们需要使用IE的方式来取消事件冒泡 
window.event.cancelBubble = true; 
}

在 IE 并没有 stopPropagation 方法,但我们可以通过 window.event.cancelBubble 来阻止事件冒泡。

监听函数
IE : attachEvent、detachEvent

非IE: addEventListener、removeEventListener

除了上面四个函数还有一个比较通用的方法是 document.getElmentById(元素ID).onclick = function(){}

事件对象
当触发事件,在监听函数执行函数里怎样才可以获取事件对象呢?在IE 中用window.event.srcElement而在非IE浏览器则用e.currentTarget

例代码:

btn.onclick = ctdClickEvent; function ctdClickEvent(e) 
{ 
if( !-[1,] ) //IE 
{ 
var readonly = "readOnly"; 
var obj = window.event.srcElement; 
}else{ //非IE 
var readonly = "readonly"; 
var obj = e.currentTarget; 
} 
var id = obj.id.replace("btn_",""); 
if( obj.value=="此项改为不续费" ) 
{ 
...... 
}else{ 
....... 
} 
sumPrice(); 
}
Javascript 相关文章推荐
用js判断浏览器是否是IE的比较好的办法
May 08 Javascript
js压缩工具 yuicompressor 使用教程
Mar 31 Javascript
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
Apr 27 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
Sep 26 Javascript
Google Maps API地图应用示例分享
Oct 23 Javascript
被遗忘的javascript的slice() 方法
Apr 20 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(一)
May 17 Javascript
javascript动画之模拟拖拽效果篇
Sep 26 Javascript
JavaScript中动态向表格添加数据
Jan 24 Javascript
解决vue-router中的query动态传参问题
Mar 20 Javascript
vant picker+popup 自定义三级联动案例
Nov 04 Javascript
vue elementUI表格控制对应列
Apr 13 Vue.js
(function($){...})(jQuery)的意思
Jul 22 #Javascript
用js实现的模拟jquery的animate自定义动画(2.5K)
Jul 20 #Javascript
一个简单的js动画效果代码
Jul 20 #Javascript
dess中一个简单的多路委托的实现
Jul 20 #Javascript
js 返回时间戳所对应的具体时间
Jul 20 #Javascript
javascript 数据类型转换(parseInt,parseFloat)
Jul 20 #Javascript
轻量级 JS ToolTip提示效果
Jul 20 #Javascript
You might like
追忆往昔!浅谈收音机的百年发展历史
2021/03/01 无线电
德生S2000南麂列岛台湾FM收听记录
2021/03/02 无线电
PHP4实际应用经验篇(1)
2006/10/09 PHP
PHP 数据结构 算法 三元组 Triplet
2011/07/02 PHP
php中用加号与用array_merge合并数组的区别深入分析
2013/06/03 PHP
php将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
php7函数,声明,返回值等新特性介绍
2018/05/25 PHP
js constructor的实际作用分析
2011/11/15 Javascript
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
用js判断输入是否为中文的函数
2014/03/10 Javascript
js加密解密字符串可自定义密码因子
2014/05/13 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
2014/08/01 Javascript
jQuery+css实现的切换图片功能代码
2016/01/27 Javascript
jQuery插件简单学习实例教程
2016/07/01 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
AngularJS路由Ui-router模块用法示例
2017/05/29 Javascript
angular2模块和共享模块详解
2018/04/08 Javascript
浅析前端路由简介以及vue-router实现原理
2018/06/01 Javascript
JavaScript插入排序算法原理与实现方法示例
2018/08/06 Javascript
详解js动态获取浏览器或页面等容器的宽高
2019/03/13 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
解决vue scoped scss 无效的问题
2020/09/04 Javascript
python中xrange用法分析
2015/04/15 Python
Python中List.count()方法的使用教程
2015/05/20 Python
python字典基本操作实例分析
2015/07/11 Python
Python3中条件控制、循环与函数的简易教程
2017/11/21 Python
教你使用python实现微信每天给女朋友说晚安
2018/03/23 Python
基于anaconda下强大的conda命令介绍
2018/06/11 Python
Python实现带下标索引的遍历操作示例
2019/05/30 Python
Python生成器常见问题及解决方案
2020/03/21 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
Python如何解除一个装饰器
2020/08/07 Python
Python urlopen()参数代码示例解析
2020/12/10 Python
GetYourGuide台湾:预订旅游活动、景点和旅游项目
2019/06/10 全球购物
石油大学毕业生自荐信
2014/01/28 职场文书