JavaScript 事件系统

 更新时间:2010年07月22日 00:41:48   作者:  
今天比较系统都学习了 JavaScript 的事件系统。
事件流
JavaScript 的事件是以一种流的形式存在的,一个事件会有多个元素同时响应。有时候这不是我们
想要的,我们只需要某个特定的元素响应我们的绑定事件就可以了。

事件分类
捕获型事件(非IE)、冒泡型事件(所有浏览器都支持)


捕获型事件是自上而下的,而冒泡型事件是自下而上的。下面我用一个图来直观表示:

冒泡型事件我们在工作中可能会比较多遇到,但捕获型事件怎样才会执行到呢,如果我们想要在非 IE 浏览器中

要创建捕获型事件,只需将 addEventListener 的第三个参数设为true就好了。

例子如下:Link

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();
}

相关文章

  • 一文学会用JS判断文字是否被省略(ellipsis)

    一文学会用JS判断文字是否被省略(ellipsis)

    这篇文章主要给大家介绍了用JS如何判断文字被省略ellipsis,CSS帮我们搞定了省略,但是JS并不知道文本什么时候被省略了,所以我们得通过JS来计算,接下来,我将介绍2种方法来实现JS计算省略,需要的朋友可以参考下
    2023-08-08
  • JavaScript实现复制图片功能的方法示例

    JavaScript实现复制图片功能的方法示例

    本文主要介绍了在JavaScript中实现复制图片的方法,先介绍了实现复制的前置知识,包括传统的 execCommand 方法及其优缺点和 Clipboard API,然后详细阐述了如何将不同形式的图片转化为blob对象并通过Clipboard API实现复制,还提及了兼容性问题及预览、下载图片的实现思路
    2025-03-03
  • JS实现选项卡效果的代码实例

    JS实现选项卡效果的代码实例

    这篇文章主要介绍了JS选项卡效果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • 深入学习JavaScript ES8中的函数式编程

    深入学习JavaScript ES8中的函数式编程

    函数式编程已经成为现代JavaScript开发中的一种主要范式,它提供了一种更清晰、更模块化、更可维护的代码编写方式,本文将深入探讨ES8中的一些关键特性,并演示如何使用这些特性进行函数式编程实践,有需要的可以参考下
    2023-09-09
  • Openlayers+EasyUI Tree动态实现图层控制

    Openlayers+EasyUI Tree动态实现图层控制

    这篇文章主要为大家详细介绍了Openlayers+EasyUI Tree动态实现图层控制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • Javascript 检测、添加、移除样式(className)函数代码

    Javascript 检测、添加、移除样式(className)函数代码

    在前台脚本中,我们经常要操作页面元素的样式,比如标签页切换时,将当前标签加上一个样式,当切换到其他标签时,再将样式还原,本文介绍的是直接添加和移除 className 的方法。
    2009-09-09
  • JavaScript 监听组合按键思路及代码实现

    JavaScript 监听组合按键思路及代码实现

    这篇文章主要介绍了JavaScript 监听组合按键思路及代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • js获取页面及个元素高度、宽度的代码

    js获取页面及个元素高度、宽度的代码

    下面小编就为大家带来一篇js获取页面及个元素高度、宽度的代码。小编觉得挺不错的,现在分享给大家,也给大家做个参考
    2016-04-04
  • js常用代码段整理

    js常用代码段整理

    以下是平时收集的几个常用代码段,大多数是从网上搜集而来。也均为未找到是谁谁原创,是否允许转载等要求, 所以如果看到的朋友发现其中有些代码是自己写的,还请原谅在下转帖出来
    2011-11-11
  • 微信小程序多列表渲染数据开关互不影响的实现

    微信小程序多列表渲染数据开关互不影响的实现

    这篇文章主要介绍了微信小程序多列表渲染数据开关互不影响的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06

最新评论