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实现页面打印的三种方法
Mar 05 Javascript
window.onbeforeunload方法在IE下无法正常工作的解决办法
Jan 23 Javascript
js本身的局限性 别让javascript做太多事
Mar 23 Javascript
在jquery中combobox多选的不兼容问题总结
Dec 24 Javascript
Iframe 自动适应页面的高度示例代码
Feb 26 Javascript
jQuery获取节点和子节点文本的方法
Jul 22 Javascript
详解Bootstrap插件
Apr 25 Javascript
js正则表达式注册页面表单验证
Oct 11 Javascript
JS html时钟制作代码分享
Mar 03 Javascript
深入理解ES6 Promise 扩展always方法
Sep 26 Javascript
Vue.js 动态为img的src赋值方法
Mar 14 Javascript
带你使用webpack快速构建web项目的方法
Nov 12 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对字符串的递增运算分析
2010/08/08 PHP
PHP 防注入函数(格式化数据)
2011/08/08 PHP
php实现可逆加密的方法
2015/08/11 PHP
一些常用的JS功能函数代码
2009/06/23 Javascript
模仿百度三维地图的js数据分享
2011/05/12 Javascript
解决javascript:window.close()在chrome,Firefox下失效的问题
2013/05/07 Javascript
jquery选择器原理介绍($()使用方法)
2014/03/25 Javascript
Javascript学习笔记之函数篇(五) : 构造函数
2014/11/23 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
2016/01/25 Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
2017/03/23 jQuery
React Native如何消除启动时白屏的方法
2017/08/08 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
小程序自定义单页面、全局导航栏的实现代码
2019/03/15 Javascript
Element Dialog对话框的使用示例
2020/07/26 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
Python开发之快速搭建自动回复微信公众号功能
2016/04/22 Python
python 接口_从协议到抽象基类详解
2017/08/24 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
学习python分支结构
2019/05/17 Python
python web框架 django wsgi原理解析
2019/08/20 Python
Python内置方法实现字符串的秘钥加解密(推荐)
2019/12/09 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
使用tensorflow进行音乐类型的分类
2020/08/14 Python
HTML+CSS3 模仿Windows7 桌面效果
2010/06/17 HTML / CSS
欧洲顶级体育电子商务网站:SportsShoes.com
2018/03/27 全球购物
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
施工安全责任书
2014/04/14 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
2015年安康杯竞赛活动总结
2015/03/26 职场文书
2015年学生会主席工作总结
2015/04/21 职场文书
浅谈redis五大数据结构和使用场景
2021/04/12 Redis
详细聊聊MySQL中慢SQL优化的方向
2021/08/30 MySQL
Python Matplotlib绘制条形图的全过程
2021/10/24 Python
青岛市的收音机研制与生产
2022/04/07 无线电
Java实现简单小画板
2022/06/10 Java/Android
阿里云服务器(windows)手动部署FTP站点详细教程
2022/08/05 Servers