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打印网页部分内容的脚本
Nov 17 Javascript
JavaScript Event学习第十章 一些可替换的事件对
Feb 10 Javascript
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
Jun 28 Javascript
jQuery实现鼠标可拖动调整表格列宽度
May 26 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
Feb 25 Javascript
Javascript代码实现仿实例化类
Apr 03 Javascript
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
May 19 Javascript
功能强大的Bootstrap组件(结合js)
Aug 03 Javascript
js实现无缝滚动图(可控制当前滚动的方向)
Feb 22 Javascript
微信小程序 选项卡的简单实例
May 24 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
Jul 24 Javascript
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
Jan 25 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之apc
2013/05/15 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
PHP使用PDO抽象层获取查询结果的方法示例
2018/05/10 PHP
Aster vs Newbee BO3 第三场2.18
2021/03/10 DOTA
jquery 简短右键菜单 多浏览器兼容
2010/01/01 Javascript
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
Table冻结表头示例代码
2013/08/20 Javascript
原生JS实现响应式瀑布流布局
2015/04/02 Javascript
简介JavaScript中的push()方法的使用
2015/06/09 Javascript
AngularJS通过$http和服务器通信详解
2016/09/21 Javascript
微信小程序 获取设备信息 API实例详解
2016/10/02 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
ionic开发中点击input时键盘自动弹出
2016/12/23 Javascript
JavaScript自定义文本框光标
2017/03/05 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
2017/06/20 Javascript
JavaScript闭包_动力节点Java学院整理
2017/06/27 Javascript
layui form表单提交后实现自动刷新
2019/10/25 Javascript
[02:29]DOTA2英雄基础教程 陈
2013/12/17 DOTA
跟老齐学Python之做一个小游戏
2014/09/28 Python
Python多线程经典问题之乘客做公交车算法实例
2017/03/22 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
Python多继承原理与用法示例
2018/08/23 Python
python同时遍历数组的索引和值的实例
2018/11/15 Python
5分钟 Pipenv 上手指南
2018/12/20 Python
Python读取实时数据流示例
2019/12/02 Python
美国最大的香水出口:FragranceX.com
2017/11/04 全球购物
android面试问题与答案
2016/12/27 面试题
高中英语教学反思
2014/02/04 职场文书
公司寄语大全
2014/04/10 职场文书
国家机关领导干部民主生活会对照检查材料思想汇报
2014/09/17 职场文书
2015年上半年信访工作总结
2015/03/30 职场文书
三八节活动主持词
2015/07/04 职场文书
新入职员工工作总结
2015/10/15 职场文书
mysql死锁和分库分表问题详解
2021/04/16 MySQL
python利用while求100内的整数和方式
2021/11/07 Python