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 相关文章推荐
IE本地存储userdata的一个bug说明
Jul 01 Javascript
JQuery中解决重复动画的方法
Oct 17 Javascript
JavaScript队列、优先队列与循环队列
Nov 14 Javascript
简单理解js的冒泡排序
Dec 19 Javascript
根据Bootstrap Paginator改写的js分页插件
Dec 25 Javascript
获取url中用&amp;隔开的参数实例(分享)
May 28 Javascript
微信小程序开发之IOS和Android兼容的问题
Sep 26 Javascript
Javascript防止图片拉伸的自适应处理方法
Dec 26 Javascript
JS基于for语句编写的九九乘法表示例
Jan 04 Javascript
从parcel.js打包出错到选择nvm的全部过程
Jan 23 Javascript
200行代码实现blockchain 区块链实例详解
Mar 14 Javascript
微信小程序自定义多列选择器使用详解
Jun 21 Javascript
(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
PHP加Nginx实现动态裁剪图片方案
2014/03/10 PHP
php提取字符串中网站url地址的方法
2014/12/03 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
超清晰的document对象详解
2007/02/27 Javascript
Gird事件机制初级读本
2007/03/10 Javascript
Javascript 构造函数 实例分析
2008/11/26 Javascript
jquery修改网页背景颜色通过css方法实现
2014/06/06 Javascript
js实现的页面矩阵图形变换特效
2016/01/26 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
JavaScript数据类型学习笔记分享
2016/09/01 Javascript
鼠标经过出现气泡框的简单实例
2017/03/17 Javascript
JavaScript实现换肤功能
2017/09/15 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
JS前端知识点总结之内置对象,日期对象和定时器相关操作
2019/07/05 Javascript
PyQt5主窗口动态加载Widget实例代码
2018/02/07 Python
python opencv读mp4视频的实例
2018/12/07 Python
python selenium执行所有测试用例并生成报告的方法
2019/02/13 Python
Python中字符串与编码示例代码
2019/05/20 Python
python__name__原理及用法详解
2019/11/02 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解
2020/06/01 HTML / CSS
亚洲最大旅游体验平台:KKday
2017/10/21 全球购物
eBay加拿大站:eBay.ca
2019/06/20 全球购物
澳大利亚美容产品及化妆品在线:Activeskin
2020/06/03 全球购物
介绍Ibatis的核心类
2013/11/18 面试题
物流合作计划书
2014/01/10 职场文书
数控技术应用个人求职信范文
2014/02/03 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
2015秋季幼儿园开学寄语
2015/03/25 职场文书
校车司机安全责任书
2015/05/11 职场文书
2016新年感言
2015/08/03 职场文书
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫
介绍一下28个JS常用数组方法
2022/05/06 Javascript
springboot+rabbitmq实现智能家居实例详解
2022/07/23 Java/Android
zabbix如何添加监控主机和自定义监控项
2022/08/14 Servers