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 相关文章推荐
js 目录列举函数
Nov 06 Javascript
禁止JQuery中的load方法装载IE缓存中文件的方法
Sep 11 Javascript
JavaScript获取页面上某个元素的代码
Mar 13 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
Oct 13 Javascript
js实现界面向原生界面发消息并跳转功能
Nov 22 Javascript
用vue和node写的简易购物车实现
Apr 25 Javascript
深入理解vue-router之keep-alive
Aug 31 Javascript
ionic2.0双击返回键退出应用
Sep 17 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
Sep 28 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
Nov 14 Javascript
ES6中Set和Map用法实例详解
Mar 02 Javascript
ant design pro中可控的筛选和排序实例
Nov 17 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 将json格式数据转换成数组的方法
2018/08/21 PHP
PHP中localeconv()函数的用法
2019/03/26 PHP
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
2009/07/18 Javascript
js客户端快捷键管理类的较完整实现和应用
2010/06/08 Javascript
几个有趣的Javascript Hack
2010/07/24 Javascript
Jquery选择子控件&quot;大于号&quot;和&quot; &quot;区别介绍及使用示例
2013/06/25 Javascript
js 得到文件后缀(通过正则实现)
2013/07/08 Javascript
jQuery CSS()方法改变现有的CSS样式表
2014/09/09 Javascript
javascript实现获取浏览器版本、操作系统类型
2015/01/29 Javascript
javascript比较两个日期相差天数的方法
2015/07/23 Javascript
js如何实现淡入淡出效果
2020/11/18 Javascript
JSON与XML的区别对比及案例应用
2016/11/11 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
angular+ionic 的app上拉加载更新数据实现方法
2017/01/16 Javascript
jQuery遮罩层实例讲解
2017/05/11 jQuery
基于jQuery的表单填充实例
2017/08/22 jQuery
vue中echarts3.0自适应的方法
2018/02/26 Javascript
bootstrap中selectpicker下拉框使用方法实例
2018/03/22 Javascript
JavaScript数据结构与算法之检索算法实例分析【顺序查找、最大最小值、自组织查询】
2019/02/22 Javascript
微信小程序城市选择及搜索功能的方法
2019/03/22 Javascript
中级前端工程师必须要掌握的27个JavaScript 技巧(干货总结)
2019/09/23 Javascript
微信小程序批量上传图片到七牛(推荐)
2019/12/19 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
2020/09/11 Javascript
[16:14]教你分分钟做大人:米拉娜(HEROS)
2014/11/24 DOTA
Python使用代理抓取网站图片(多线程)
2014/03/14 Python
Python实现模拟时钟代码推荐
2015/11/08 Python
Python常用时间操作总结【取得当前时间、时间函数、应用等】
2017/05/11 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
2020/07/21 Python
GAP欧盟网上商店:GAP EU
2016/09/13 全球购物
党员违纪检讨书
2014/02/18 职场文书
地质灾害防治方案
2014/05/14 职场文书
本科毕业生自荐信
2014/05/26 职场文书
财务部岗位职责
2015/02/03 职场文书
评职称个人总结
2015/03/05 职场文书
一文搞懂python异常处理、模块与包
2021/06/26 Python
Python matplotlib 利用随机函数生成变化图形
2022/04/26 Python