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 和 CSS 实现脚注(Footnote)效果
Sep 09 Javascript
JavaScript自定义DateDiff函数(兼容所有浏览器)
Mar 01 Javascript
JavaScript学习笔记之Function对象
Jan 22 Javascript
JS实现自动定时切换的简洁网页选项卡效果
Oct 13 Javascript
Angularjs中UI Router全攻略
Jan 29 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
Jun 03 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
Jun 12 Javascript
js实现图片淡入淡出切换简易效果
Aug 22 Javascript
自制简易打赏功能的实例
Sep 02 Javascript
详解Webpack+Babel+React开发环境的搭建的方法步骤
Jan 09 Javascript
js数据类型检测总结
Aug 05 Javascript
解决vue中el-tab-pane切换的问题
Jul 19 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自定义函数call_user_func和call_user_func_array详解
2011/07/14 PHP
TMDPHP 模板引擎使用教程
2012/03/13 PHP
php获取服务器信息的实现代码
2013/02/04 PHP
php简单socket服务器客户端代码实例
2015/05/18 PHP
点击弹出层外区域关闭弹出层jquery特效示例
2013/08/25 Javascript
jQuery实现类似滑动门切换效果的层切换
2013/09/23 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
javascript实现可拖动变色并关闭层窗口实例
2015/05/15 Javascript
黑帽seo劫持程序,js劫持搜索引擎代码
2015/09/15 Javascript
基于jQuery实现搜索关键字自动匹配功能
2020/03/26 Javascript
JavaScript制作简单的日历效果
2016/03/10 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
2016/07/14 Javascript
微信小程序 教程之小程序配置
2016/10/17 Javascript
Angular实现下载安装包的功能代码分享
2017/09/05 Javascript
Vue页面骨架屏的实现方法
2018/05/22 Javascript
微信小程序自定义对话框弹出和隐藏动画
2018/07/19 Javascript
小程序实现背景音乐播放和暂停
2020/06/19 Javascript
Python 初始化多维数组代码
2008/09/06 Python
python实现用户登录系统
2016/05/21 Python
TensorFlow模型保存和提取的方法
2018/03/08 Python
Python多进程原理与用法分析
2018/08/21 Python
python之pyqt5通过按钮改变Label的背景颜色方法
2019/06/13 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
倩碧英国官网:Clinique英国
2018/08/10 全球购物
JD Sports芬兰:英国领先的运动鞋和运动服饰零售商
2018/11/16 全球购物
应届生自荐信范文
2014/02/21 职场文书
体育专业自荐书
2014/05/29 职场文书
卫生标语大全
2014/06/21 职场文书
市场策划求职信
2014/08/07 职场文书
学习十八大宣传标语
2014/10/09 职场文书
2014年培训工作总结范文
2014/11/27 职场文书
2015年幼儿园保育工作总结
2015/05/12 职场文书
七年级作文之英语老师
2019/10/28 职场文书
前端实现滑动按钮AJAX与后端交互的示例代码
2022/02/24 Javascript