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 相关文章推荐
用javascript实现的激活输入框后隐藏初始内容
Jun 29 Javascript
原生js实现查找/添加/删除/指定元素的class
Apr 12 Javascript
js监听鼠标事件控制textarea输入字符串的个数
Sep 29 Javascript
JavaScript检查子字符串是否在字符串中的方法
Feb 03 Javascript
JS生成某个范围的随机数【四种情况详解】
Apr 20 Javascript
Google 地图叠加层实例讲解
Aug 06 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
Jan 13 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
Nov 17 Javascript
JS实现监控微信小程序的原理
Jun 15 Javascript
nuxt中使用路由守卫的方法步骤
Jan 27 Javascript
layui 弹出层回调获取弹出层数据的例子
Sep 02 Javascript
基于JQuery实现页面定时弹出广告
May 08 jQuery
(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 飞信好友免费短信API接口开源版
2010/07/22 PHP
php注销代码(session注销)
2012/05/31 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
2013/06/21 PHP
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
jQuery CSS3相结合实现时钟插件
2016/01/08 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
2016/03/30 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
2020/04/20 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
2016/09/28 Javascript
Angular2 多级注入器详解及实例
2016/10/30 Javascript
nodejs的压缩文件模块archiver用法示例
2017/01/18 NodeJs
jQuery实现radio第一次点击选中第二次点击取消功能
2017/05/15 jQuery
js解决软键盘遮挡输入框的问题分享
2017/12/19 Javascript
JavaScript异步加载问题总结
2018/02/17 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
2018/08/07 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【矩形情况】
2018/12/13 Javascript
JQuery复选框全选效果如何实现
2020/05/08 jQuery
Python continue语句用法实例
2014/03/11 Python
Python动态导入模块的方法实例分析
2018/06/28 Python
python使用sklearn实现决策树的方法示例
2019/09/12 Python
jupyter notebook插入本地图片的实现
2020/04/13 Python
Python3内置函数chr和ord实现进制转换
2020/06/05 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
jupyter 添加不同内核的操作
2021/02/06 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
.NET初级开发工程师面试题
2014/04/18 面试题
幼儿园家长评语
2014/02/10 职场文书
清正廉洁演讲稿
2014/05/22 职场文书
淘宝活动总结范文
2014/06/26 职场文书
党支部群众路线整改措施思想汇报
2014/10/10 职场文书
优秀共产党员事迹材料
2014/12/18 职场文书
教师工作表现评语
2014/12/31 职场文书
个人先进事迹总结
2015/02/26 职场文书
企业财务管理制度范本
2015/08/04 职场文书
详解python的内存分配机制
2021/05/10 Python