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 使用手册(二)
Sep 23 Javascript
Jquery 点击按钮显示和隐藏层的代码
Jul 25 Javascript
jquery 按钮状态效果 正常、移上、按下
Aug 12 Javascript
js实现表格字段排序
Feb 19 Javascript
jquery通过visible来判断标签是否显示或隐藏
May 08 Javascript
node.js中的fs.writeFile方法使用说明
Dec 14 Javascript
基于jquery实现鼠标左右拖动滑块滑动附源码下载
Dec 23 Javascript
论JavaScript模块化编程
Mar 07 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
May 25 Javascript
浅谈jquery页面初始化的4种方式
Nov 27 Javascript
vue 实现微信浮标效果
Sep 01 Javascript
分享Angular http interceptors 拦截器使用(推荐)
Nov 10 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+javascript实现二级级联菜单的制作
2008/05/06 PHP
PHP函数常用用法小结
2010/02/08 PHP
php下载文件的代码示例
2012/06/29 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
2017/05/19 PHP
PHP echo()函数讲解
2019/02/15 PHP
PHP常见的几种攻击方式实例小结
2019/04/29 PHP
改变javascript函数内部this指针指向的三种方法
2010/04/23 Javascript
EASYUI TREEGRID异步加载数据实现方法
2012/08/22 Javascript
jQuery插件的写法分享
2013/06/12 Javascript
利用JS来控制键盘的上下左右键(示例代码)
2013/12/14 Javascript
表单序列化与jq中的serialize使用示例
2014/02/21 Javascript
jquery中常用的函数和属性详细解析
2014/03/07 Javascript
用javascript对一个json数组深度赋值示例
2014/07/27 Javascript
JS+JSP通过img标签调用实现静态页面访问次数统计的方法
2015/12/14 Javascript
JS实现快速的导航下拉菜单动画效果附源码下载
2016/11/01 Javascript
Ajax基础知识详解
2017/02/17 Javascript
vue 项目地址去掉 #的方法
2018/10/20 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
微信小程序下拉加载和上拉刷新两种实现方法详解
2019/09/05 Javascript
JS模拟浏览器实现全局搜索功能
2019/09/11 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
elementui实现预览图片组件二次封装
2020/12/29 Javascript
python基础教程之对象和类的实际运用
2014/08/29 Python
django使用xlwt导出excel文件实例代码
2018/02/06 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
2019/01/08 Python
pandas中遍历dataframe的每一个元素的实现
2019/10/23 Python
世界上最大的隐形眼镜商店:1-800 Contacts
2018/11/03 全球购物
为您搜罗全球潮流時尚品牌:HBX
2019/12/04 全球购物
无故旷工检讨书
2014/01/26 职场文书
人事专员岗位职责范本
2014/03/04 职场文书
2015年生产车间工作总结
2015/04/22 职场文书
一次SQL如何查重及去重的实战记录
2022/03/13 MySQL
中国古风插画师排行榜:夏达第一,第三是阴阳师姑获鸟皮肤创作者
2022/03/18 国漫
Echarts如何重新渲染实例详解
2022/05/30 Javascript