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实现判断滚动条滚到页面底部并执行事件的方法
Dec 18 Javascript
JS+CSS实现可拖动的弹出提示框
Feb 16 Javascript
javascript精确统计网站访问量实例代码
Dec 19 Javascript
AngularJS 指令的交互详解及实例代码
Sep 14 Javascript
通过jsonp获取json数据实现AJAX跨域请求
Jan 22 Javascript
实例解析js中try、catch、finally的执行规则
Feb 24 Javascript
Vuejs实现购物车功能
Nov 05 Javascript
JavaScript错误处理操作实例详解
Jan 04 Javascript
Node.js动手撸一个静态资源服务器的方法
Mar 09 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
Sep 18 Javascript
vue 导航内容设置选中状态样式的例子
Nov 01 Javascript
JavaScript实现HSL拾色器
May 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的变量总结 新手推荐
2011/04/18 PHP
PHP数组实例总结与说明
2011/08/23 PHP
深入解析php之apc
2013/05/15 PHP
PHP开发中常用的十个代码样例
2016/02/02 PHP
PHP PDOStatement::rowCount讲解
2019/02/01 PHP
IE关闭时判断及AJAX注销案例学习
2013/02/18 Javascript
js jquery获取随机生成id的服务器控件的三种方法
2013/07/11 Javascript
js实现正方形颜色从下往上升的效果
2014/08/04 Javascript
JS实现跟随鼠标立体翻转图片的方法
2015/05/04 Javascript
JS使用正则表达式除去字符串中重复字符的方法
2015/11/05 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
2016/04/18 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
Javascript中的prototype与继承
2017/02/06 Javascript
详解vue组件开发脚手架
2018/06/15 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
单页面vue引入百度统计的使用方法示例详解
2018/10/13 Javascript
vue实现百度下拉列表交互操作示例
2019/03/12 Javascript
js+html5 canvas实现ps钢笔抠图
2019/04/28 Javascript
d3.js实现图形缩放平移
2019/12/19 Javascript
JS实现长图上下滚动效果
2020/03/19 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
2019/02/13 Python
python-django中的APPEND_SLASH实现方法
2019/06/21 Python
Python八皇后问题解答过程详解
2019/07/29 Python
Python 列表中的修改、添加和删除元素的实现
2020/06/11 Python
实例代码讲解Python 线程池
2020/08/24 Python
纯CSS3制作漂亮带动画效果的主机价格表
2015/04/25 HTML / CSS
医院门卫岗位职责
2013/12/30 职场文书
高效课堂标语
2014/06/26 职场文书
政协会议宣传标语
2014/10/09 职场文书
2016关于读书活动的心得体会
2016/01/14 职场文书
Go 在 MongoDB 中常用查询与修改的操作
2021/05/07 Golang
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS
JavaCV实现照片马赛克效果
2022/01/22 Java/Android
PyTorch中permute的使用方法
2022/04/26 Python
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers