JavaScript事件流、冒泡机制及事件处理详解

作者:交互手记时间:2026-10-28 23:03:31浏览:617

本文详解JavaScript中的事件流概念,对比IE冒泡流与Netscape捕获流。重点解析事件冒泡的执行顺序及浏览器差异,并提供获取兼容事件对象、停止冒泡(stopPropagation/cancelBubble)及阻止默认行为(preventDefault/returnValue)的标准代码实现,帮助开发者掌握跨浏览器事件控制。

1、事件流

JavaScript事件流与冒泡机制

事件流描述了页面中接收事件的具体顺序。历史上,IE浏览器提出了冒泡流的概念,而Netscape Communicator则提出了捕获流的概念。

2、事件冒泡(event bubbling)

事件冒泡是指事件从最具体的元素(即嵌套层次最深的节点)开始接收,然后逐级向上传播给较不具体的节点(直至文档)。示例结构如下:

代码如下:

<html>
<head>
<title>事件冒泡</title>
</head>
<body>
<div id="myDiv">点击我</div>
</body>
</html>
window.onload = function(){
var obj = document.getElementById("test");
obj.onclick = function(){
alert(this.tagName);
    };
document.body.onclick = function(){
alert(this.tagName);
    };
document.documentElement.onclick = function(){
alert(this.tagName);
    };
document.onclick = function(){
alert("document");
    };
window.onclick = function(){
alert("window");
    }
};

事件传播顺序:div——>body——>html——>document

注意: 现代所有浏览器都支持冒泡事件,但实现还有一些差别。IE5.5及更早版本中的事件冒泡会直接从body跳到document(不执行html)。Firefox、Chrome和Safari则将事件一直冒泡到window对象。

停止事件冒泡与阻止默认行为

3、停止事件冒泡和取消默认事件

a. 获取事件对象

代码如下:

function getEvent(event) {
// window.event IE
// event 非IE
return event || window.event;
} 

b 功能:停止事件冒泡

代码如下:

function stopBubble(e) {
// 如果提供了事件对象,则这是一个非IE浏览器
if ( e && e.stopPropagation ) {
// 因此它支持W3C的stopPropagation()方法
e.stopPropagation();
} else {
// 否则,我们需要使用IE的方式来取消事件冒泡
window.event.cancelBubble = true;
}
}

c. 阻止浏览器的默认行为

代码如下:

function stopDefault( e ) {
// 阻止默认浏览器动作(W3C)
if ( e && e.preventDefault ) {
e.preventDefault();
} else {
// IE中阻止函数器默认动作的方式
window.event.returnValue = false;
    }
return false;
}
作者最新文章