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 克隆数组最简单的方法
Feb 12 Javascript
js 跨域和ajax 跨域问题小结
Jul 01 Javascript
文字不间断滚动(上下左右)实例代码
Apr 21 Javascript
JQuery右键菜单插件ContextMenu使用指南
Dec 19 Javascript
JS去除空格和换行的正则表达式(推荐)
Jun 14 Javascript
js动态添加的DIV中的onclick事件简单实例
Jul 25 Javascript
第一次接触神奇的Bootstrap
Oct 14 Javascript
通过sails和阿里大于实现短信验证
Jan 04 Javascript
Angular.JS内置服务$http对数据库的增删改使用教程
May 07 Javascript
简述vue中的config配置
Jan 23 Javascript
微信小程序缓存过期时间的使用详情
May 12 Javascript
Jquery让form表单异步提交代码实现
Nov 14 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编码规范的深入探讨
2013/06/06 PHP
PHP链接MySQL的常用扩展函数
2014/10/23 PHP
yii2-GridView在开发中常用的功能及技巧总结
2017/01/07 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
django中的ajax组件教程详解
2018/10/18 PHP
广告切换效果(缓动切换)
2009/05/27 Javascript
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
Angularjs中的页面访问权限怎么设置
2016/11/11 Javascript
ES6中参数的默认值语法介绍
2017/05/03 Javascript
seaJs使用心得之exports与module.exports的区别实例分析
2017/10/13 Javascript
jQuery响应滚动条事件功能示例
2017/10/14 jQuery
关于vue单文件中引用路径的处理方法
2018/01/08 Javascript
nodejs爬虫初试superagent和cheerio
2018/03/05 NodeJs
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
vue 二维码长按保存和复制内容操作
2020/09/22 Javascript
如何在 ant 的table中实现图片的渲染操作
2020/10/28 Javascript
[01:20]PWL开团时刻DAY9——听说潮汐没用?
2020/11/10 DOTA
Python操作使用MySQL数据库的实例代码
2017/05/25 Python
python检测主机的连通性并记录到文件的实例
2018/06/21 Python
Python在for循环中更改list值的方法【推荐】
2018/08/17 Python
python爬虫 线程池创建并获取文件代码实例
2019/09/28 Python
Pyspark获取并处理RDD数据代码实例
2020/03/27 Python
python中用ggplot绘制画图实例讲解
2021/01/26 Python
HTML5 body设置自适应全屏
2020/05/07 HTML / CSS
婴儿鞋,独特的婴儿服装和配件:Zutano
2018/11/03 全球购物
合同专员岗位职责
2013/12/18 职场文书
企业演讲稿范文
2013/12/28 职场文书
股份合作协议书
2014/04/12 职场文书
小学毕业演讲稿
2014/04/25 职场文书
群众路线教育实践活动对照检查材料思想汇报(副处级领导)
2014/10/04 职场文书
放假通知范文
2015/04/14 职场文书
Spring Cloud OpenFeign模版化客户端
2022/06/25 Java/Android