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 相关文章推荐
jquery Mobile入门—多页面切换示例学习
Jan 08 Javascript
javascript抽象工厂模式详细说明
Dec 16 Javascript
浅谈javascript 函数内部属性
Jan 21 Javascript
javascript中this的四种用法
May 11 Javascript
javascript实现数据双向绑定的三种方式小结
Mar 09 Javascript
Angular 4 指令快速入门教程
Jun 07 Javascript
详解用vue编写弹出框组件
Jul 04 Javascript
详解微信小程序开发聊天室—实时聊天,支持图片预览
May 20 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
Mar 26 Javascript
react-router-dom 嵌套路由的实现
May 02 Javascript
基于vue+element实现全局loading过程详解
Jul 10 Javascript
js实现跳一跳小游戏
Jul 31 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
收音机术语解释
2021/03/01 无线电
php传值赋值和传地址赋值用法实例分析
2015/06/20 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
深入理解 PHP7 中全新的 zval 容器和引用计数机制
2018/10/15 PHP
那些年,我还在学习jquery 学习笔记
2012/03/05 Javascript
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
2013/06/26 Javascript
js浮点数保留两位小数点示例代码(四舍五入)
2013/12/26 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
jQuery中on()方法用法实例详解
2015/02/06 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
2015/09/16 Javascript
使用jQuery获取data-的自定义属性
2015/11/10 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
js基于setTimeout与setInterval实现多线程
2016/06/17 Javascript
JavaScript输入分钟、秒倒计时技巧总结(附代码)
2017/08/17 Javascript
Angular5给组件本身的标签添加样式class的方法
2018/04/07 Javascript
JS中call和apply函数用法实例分析
2018/06/20 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
2018/11/14 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
2019/04/14 Javascript
JS+DIV实现拖动效果
2020/02/11 Javascript
JavaScript实现点击出现子菜单效果
2021/02/08 Javascript
[52:03]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第三场 1月31日
2021/03/11 DOTA
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
python根据文章标题内容自动生成摘要的实例
2019/02/21 Python
对Python中小整数对象池和大整数对象池的使用详解
2019/07/09 Python
Cython编译python为so 代码加密示例
2019/12/23 Python
Python生成器实现简单&quot;生产者消费者&quot;模型代码实例
2020/03/27 Python
使用HTML5的Canvas绘制曲线的简单方法
2015/09/08 HTML / CSS
TripAdvisor日本:全球领先的旅游网站
2019/02/14 全球购物
《乌塔》教学反思
2014/02/17 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
董事长岗位职责
2015/02/13 职场文书
旷工辞退通知书
2015/04/17 职场文书
信用卡工作证明范本
2015/06/19 职场文书
教师节获奖感言
2015/07/31 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
Go gorilla/sessions库安装使用
2022/08/14 Golang