JavaScript事件——冒泡、捕获

本节要点:1.干预系统的事件处理机制(一)DOM事件流

(二)停止事件冒泡

(三)阻止事件的默认行为

1.干预系统的事件处理机制

(一)DOM事件流

DOM模型是一个树形结构,在DOM模型中,HTML元素是有层次的。当一个HTML元素上产生一个事件时,该事件会在DOM树中元素节点与根节点之间按特定的顺序传播,路径所经过的节点都会收到该事件,这个传播过程就是DOM事件流。

DOM事件标准定义了两种事件流,分别是捕获事件和冒泡事件。

1.冒泡事件流

默认情况下,事件使用冒泡事件流。当事件(例如单击事件)在某一DOM元素上被触发时,事件将沿着该节点的各个父结点冒泡穿过整个DOM节点层次。在冒泡过程中的任何时候都可以终止事件的冒泡。如果不停止事件的传播,事件将一直通过DOM冒泡直至到达文档根。

(冒泡往上走)

2.捕获事件流

于冒泡模型相反,在捕获事件流模型中,事件的处理将从DOM层次的根开始,而不是从触发事件的目标元素开始,事件被从目标元素的所有所有祖先元素依次往下传递。在这个过程中,事件会被从文档的根到事件目标元素之间各个继承派生的元素所捕获。

(捕获往下走)

3.DOM标准的事件模型

DOM标准同时支持捕获事件模型和冒泡事件模型,但是,捕获事件模型先发生。两种事件流都会触发DOM中的所有对象,从document对象开始,也在document对象结束。

4.事件传导的3个阶段

(1)事件捕捉(Capturing)阶段:事件将沿着DOM树向下传送,经过目标节点的每一个祖先节点,直至目标节点。例如,用户单击了一个超链接,则该单击事件将从document节点转送到html元素、body元素以及包含该链接的p元素。目标节点就是触发事件的DOM节点。

(2)目标(target)阶段:在此阶段中,事件传导到目标节点。浏览器在查找到已经指定给目标事件的监听器后,就会运行该监听器。

(3)冒泡(Bubbling)阶段:事件将沿着DOM树向上转送,再次逐个访问目标元素的祖先节点直到document节点。该过程中的每一步,浏览器都将检测那些不是捕捉事件监听器的事件监听器并执行它们。(即:与触发事件无关的事件监听器也由于冒泡将被执行)。

(二)停止事件冒泡

当事件(例如单击事件)在某一DOM元素上被触发时,事件将沿着该节点的各个父节点冒泡穿过整个DOM节点层次,直到遇到依附有该事件类型处理器的节点。


<!DOCTYPE html>

<html>

<head>

<title>Test</title>

<meta charset="utf-8">

<link rel="stylesheet" type="text/css" href="style.css">

<script type="text/javascript" src="jquery.js"></script>

<script type="text/javascript">

function doSometing(obj,evt){

alert(obj.id);

// 做浏览器兼容

var e = (evt)? evt:window.event;      //获取IE或非IE浏览器的事件

if (window.event) {                              //如果是IE浏览器

e.cancelBubble = true;         //IE浏览器,设置该属性为true,取消事件冒泡

}else{

e.stopPropagation();                        //非IE浏览器,该方法取消事件的进一步捕获或冒泡。

}

}

</script>

</head>

<body>

<div id="parent1" onclick="alert(this.id);" style="width: 250px;background-color: #cacaca">

<p>This is parent1 div</p>

<div id="child1" onclick="alert(this.id);" style="width: 200px;background-color: orange">

<p>This is child1.Will bubble.</p>

</div>

</div>

<br>

<div id="parent2" onclick="alert(this.id);" style="width: 250px;background-color: cyan;">

<p>This is parent2 div</p>

<div id="child2" onclick="doSomething(this,event);" style="width: 200px;background-color: #aeaeae">

<p>This is child2.</p>

</div>

</div>

</div>

</body>

</html>

如图所示,以上代码定义了4个div,其中2个父div,2个子div。单击每个div都会弹出一个消息框,显示其id。单击child1和child2时,事件会冒泡传导到其父元素parent1和parent2。因此,单击child1会弹出两个消息框。而单击child2时,会调用doSomethig函数,使用cancelBubble属性或stopPropagation()方法来停止事件冒泡。

(三)阻止事件的默认行为

事件的默认行为是指浏览器在事件传递和处理完成后自动执行的与该事件关联的默认动作。例如,单击一个超链接的默认行为是访问其定义的url。

IE和其他浏览器阻止事件的默认行为的方法不同。在IE中,可以通过设置event对象的returnValue属性为false来阻止事件的默认行为;在其他浏览器中,则可以通过设置event对象的preventDefault()方法来实现。


<!DOCTYPE html>

<html>

<head>

<title>Test</title>

<meta charset="utf-8">

<link rel="stylesheet" type="text/css" href="style.css">

<script type="text/javascript" src="jquery.js"></script>

<script type="text/javascript">

window.onload = function(){

var test = document.getElementById(‘test‘);

test.onclick = function(e){                     //当单击此超链接时执行这个函数

alert(‘URL:‘ + this.href + ‘,不会跳转‘);

stopDefault(e);

}

}

function stopDefault(e){

if(e && e.preventDefault){               //判断浏览器是非IE浏览器

e.preventDefault();            //非IE浏览器下使用preventDefault方法

}else{

//IE浏览器下令事件(window.event)的returnValue属性为false;

window.event.returnValue = false;

}

return false;

}

</script>

</head>

<body>

<a href="http://www.baidu.com" id="test">百度</a>

</body>

</html>

可以通过event对象的preventDefault属性来判断浏览器是否支持preventDefault()方法。如果preventDefault属性值为true则表示支持,否则不支持。

时间: 2024-07-29 18:14:22

JavaScript事件——冒泡、捕获的相关文章

解析Javascript事件冒泡机制

本资源引自: 解析Javascript事件冒泡机制 - 我的程序人生 - 博客频道 - CSDN.NET http://blog.csdn.net/luanlouis/article/details/23927347 ----------------------------------------------------------------------------------------------------------------------------------------- 1.

转:JavaScript事件冒泡简介及应用

(本文转载自别处) JavaScript事件冒泡简介及应用 一.什么是事件冒泡 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window). 打个比方说:你在地方法院要上诉一件案子,如果地方没有处理此类案件的法

JavaScript事件冒泡和事件委托

JavaScript事件冒泡和事件委托 付建宇 - 2 条评论 接触JavaScript不久,学的东西也不是特别多.小雨就是习惯把平时学到的东西拿出来分享.一方面加强自己的印象,一方面可以让自己的经验为他人答疑解惑.我们知道JavaScript可以监控页面上元素的各种事件,常用的事件有很多,例如点击,鼠标移入.移出,元素改变等等.这次主要说一下事件冒泡及其一个比较酷的应用,事件委托.不做特殊说明,以下都在jQuery框架内执行. 事件冒泡 什么是“事件冒泡”呢?假设这里有一杯水,水被用某种神奇的

Javascript事件冒泡,没有想象中那么糟糕

Javascript事件冒泡,没有想象中那么糟糕  提到js事件,我们可能第一时间反应的就是“如何阻止事件冒泡”:但是事件冒泡真的是如我们想象的那么糟糕吗? 1. Event 对象  Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 2. 事件句柄 (Event Handlers)  指能够使 HTML 事件触发浏览器中的行为,比如点击(onclick).鼠标悬浮(onfocus)等 3. 什么是事件冒泡  一个对象(event.srcEle

Javascript 事件冒泡

先来看个Javascript 事件冒泡的例子. 在div 元素中有一个button,他们都绑定了一个click事件,这是能够产生事件冒泡的前提.当你 单击button的时候,会弹出两个警告框,一个是button的click事件引起的,另一个是div的click事件产生的. 你只单击了button,div的元素也触发了click事件,这就是事件冒泡引起的. <html> <head> <title>event bubble sample</title> <

JavaScript事件冒泡与捕获

event.preventDefault();    如果event.cancelable的值为true,可以取消默认事件 event.cancelable;             元素是否可以取消默认事件,true可以取消,false不可以取消,IE8不支持 event.cancelBubble;         true:设置当前事件不冒泡,false:设置当前事件冒泡 event.stopPropagation();  停止当前事件的分发,不论当前事件是在冒泡还是在捕获阶段 事件--怎样

解析Javascript事件冒泡机制(转) 本文转自:http://blog.csdn.net/luanlouis/article/details/23927347

本文转自:http://blog.csdn.net/luanlouis/article/details/23927347 1. 事件 在浏览器客户端应用平台,基本生都是以事件驱动的,即某个事件发生,然后做出相应的动作. 浏览器的事件表示的是某些事情发生的信号.事件的阐述不是本文的重点,尚未了解的朋友,可以访问W3school教程 进行了解,这将有助于更好地理解以下的内容 . 2. 冒泡机制 什么是冒泡呢? 下面这个图片大家应该心领神会吧,气泡从水底开始往上升,由深到浅,升到最上面.在上升的过程中

javascript事件冒泡

1. 事件 在浏览器客户端应用平台,基本生都是以事件驱动的,即某个事件发生,然后做出相应的动作. 浏览器的事件表示的是某些事情发生的信号.事件的阐述不是本文的重点,尚未了解的朋友,可以访问W3school教程 进行了解,这将有助于更好地理解以下的内容 . 2.冒泡机制 什么是冒泡呢? 下面这个图片大家应该心领神会吧,气泡从水底开始往上升,由深到浅,升到最上面.在上升的过程中,气泡会经过不同深度层次的水. 相对应地:这个气泡就相当于我们这里的事件,而水则相当于我们的整个dom树:事件从dom 树的

Javascript事件冒泡机制

1. 事件 在浏览器客户端应用平台,基本生都是以事件驱动的,即某个事件发生,然后做出相应的动作. 浏览器的事件表示的是某些事情发生的信号.事件的阐述不是本文的重点,尚未了解的朋友,可以访问W3school教程 进行了解,这将有助于更好地理解以下的内容 . 2.冒泡机制 什么是冒泡呢? 下面这个图片大家应该心领神会吧,气泡从水底开始往上升,由深到浅,升到最上面.在上升的过程中,气泡会经过不同深度层次的水. 相对应地:这个气泡就相当于我们这里的事件,而水则相当于我们的整个dom树:事件从dom 树的