出处:http://www.cnblogs.com/sanshi/archive/2009/02/18/1393165.html (感谢三生石上)

这是一个基础性的文章,使用Javascript观察DOM中的事件冒泡机制,并介绍如何阻止默认行为和如何组织事件冒泡的方法。

1. 第一个例子可以在Firefox下运行


<div id="container1" onclick="alert('click container1');">
    <div id="container2" onclick="alert('click container2');">
        <a href="http://www.google.com" target="_blank" onclick="fn1(event);">Google</a>
        <a href="http://www.google.com" target="_blank" onclick="fn2(event);">Google</a>
        <a href="http://www.google.com" target="_blank" onclick="fn3(event);">Google</a>
        <a href="http://www.google.com" target="_blank" onclick="fn4(event);">Google</a>
    </div>
</div>

function fn1(event) {
    alert('click google');
} function fn2(event) {
    alert('click google');
    event.preventDefault();
} function fn3(event) {
    alert('click google');
    event.stopPropagation();
} function fn4(event) {
    alert('click google');
    event.preventDefault();
    event.stopPropagation();
}

点击第一个链接,alert_google -> alert_container2 -> alert_container1 -> open_google_page

点击第二个链接,alert_google -> alert_container2 -> alert_container1

点击第三个链接,alert_google -> open_google_page

点击第四个链接,alert_google

可以看到,事件冒泡是从最初引发事件的HTML节点开始,一步步向上引发父节点的相同事件。

在Firefox中,我们可以通过 preventDefault 函数阻止默认的行为(比如这个例子中,点击链接的默认行为是打开链接地址)

通过 stopPropagation 函数阻止事件冒泡。

相同的过程在IE下的实现有点不同,一是事件对象(event)在IE下是作为 window 对象的一个属性,

二是阻止事件的默认行为或阻止事件冒泡的做法也有所不同,请看:

2. 观察IE下的事件冒泡


<div id="container1_ie" onclick="alert('click container1');">
    <div id="container2_ie" onclick="alert('click container2');">
        <a href="http://www.google.com" target="_blank" onclick="fn1_ie();">Google</a> <a
            href="http://www.google.com" target="_blank" onclick="fn2_ie();">Google</a>
        <a href="http://www.google.com" target="_blank" onclick="fn3_ie();">Google</a> <a
            href="http://www.google.com" target="_blank" onclick="fn4_ie();">Google</a>
    </div>
</div>

function fn1_ie() {
    alert('click google');
} function fn2_ie() {
    alert('click google');
    event.returnValue = false;
} function fn3_ie() {
    alert('click google');
    event.cancelBubble = true;
} function fn4_ie() {
    alert('click google');
    event.returnValue = false;
    event.cancelBubble = true;
}
同样:

点击第一个链接,alert_google -> alert_container2 -> alert_container1 -> open_google_page

点击第二个链接,alert_google -> alert_container2 -> alert_container1

点击第三个链接,alert_google -> open_google_page

点击第四个链接,alert_google

javascript的事件冒泡【转】的更多相关文章

  1. JavaScript 阻止事件冒泡的实现方法

    JavaScript 阻止事件冒泡,无使用其它插件来辅助,原生JS代码,考虑到浏览器的兼容性问题,这里对IE/火狐.Operating以及Chrome都有针对性的判断,代码如下: function c ...

  2. JavaScript(3)---事件冒泡、事件捕获

    JavaScript(3)---事件冒泡与事件捕获 一.理解冒泡与捕获 假设有这么一段代码 <body> <div><p>标签</p> </div ...

  3. 浅谈javascript中事件冒泡与事件捕获

    事件冒泡:一个事件会顺着他的层级一直往上传,一直传到document上为止,即从盒模型上看是从内到外的过程. 例: <!DOCTYPE html><html lang="e ...

  4. javascript阻止事件冒泡的兼容写法及其相关示例

    //阻止事件冒泡的兼容写法 function stopBubble(e){ //如果提供了事件对象,则是一个非IE浏览器 if(e && e.stopPropagation) //因此 ...

  5. javascript 停止事件冒泡以及阻止默认事件冒泡

    停止事件冒泡 function stopBubble(e) { // 如果提供了事件对象,则这是一个非IE浏览器 if ( e && e.stopPropagation ) { // ...

  6. JavaScript 防止事件冒泡

    在我们书写一个弹窗的时候,我们往往需要点击弹窗的其他地方来隐藏弹窗. 通常我们会写成: $(document).bind('click',function(){ $('.pop-box').hide( ...

  7. JavaScript阻止事件冒泡(兼容IE、Chrome、FF)

    这里仅仅是一个简单代码demo,因为时间问题并未做深入研究,因为今天做项目时要用到阻止事件冒泡的内容,找了好多才找到一个可以使用的,特记录之. <!DOCTYPE HTML> <ht ...

  8. javascript的事件冒泡,阻止事件冒泡和事件委托, 事件委托是事件冒泡的一个应用。

    首先,弄明白js 当中,什么是事件,事件模型在js中是如何设计的.什么是事件冒泡? 什么是“事件冒泡”呢?假设这里有一杯水,水被用某种神奇的方式分成不同颜色的几层.这时,从最底层冒出了一个气泡,气泡会 ...

  9. 探讨JavaScript的事件冒泡

    JavaSciprt事件中有两个很重要的特性:事件冒泡以及目标元素. 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发.这一过程被称为事件冒泡: ...

随机推荐

  1. Echarts运用

    echarts客户端写法:http://echarts.baidu.com/doc/example.html  ,下载echarts-2.0.4.jar包,把src里面的js引入到项目里,在放esl. ...

  2. cx_Oracle.DatabaseError: ORA-12541: TNS:no listener

    问题:利用Python连接Oracle时报错,完整过程如下 import cx_Oracle conn = cx_Oracle.connect('testma/dingjia@192.168.88.1 ...

  3. TCP/IP协议:最大传输单元MTU 和 最大分节大小MSS

    MTU = MSS + TCP Header + IP Header. mtu是网络传输最大报文包. mss是网络传输数据最大值. MTU:maximum transmission unit,最大传输 ...

  4. 【UVa】11882 Biggest Number(dfs+剪枝)

    题目 题目     分析 典型搜索,考虑剪枝. 统计一下联通分量. 1.本位置能够达到所有的点的数量加上本已有的点,还没有之前的结果长,直接返回. 2.当本位置能够达到所有的点的数量加上本已有的点与之 ...

  5. Mysql--可用的 MySQL 产品和专业服务

    一.MySQL Community Edition(社区版):MySQL Community Edition is the freely downloadable version of the wor ...

  6. NIO buffer 缓冲区 API

    package bhz.nio.test; import java.nio.IntBuffer; public class TestBuffer { public static void main(S ...

  7. 关于@Autowired使用注意点

    @Autowired是按类型进行装配的,那么我一个接口UserInterface,有多个实现类AImpl(@service(name="userInterface1")),BImp ...

  8. "网页安全政策"(Content Security Policy,缩写 CSP)的来历

    作者:阿里聚安全链接:https://www.zhihu.com/question/21979782/answer/122682029来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  9. C#对Excel的图文操作

    1.打印Excel 目前的商业工具如水晶报表,ActiveReport等,都提供了灵活,强大的功能,但是对于比较特殊化的表格,特别是国内的一些应用,都是一个个的格子组成的,这样要是用线来一根根画就比较 ...

  10. 将网页的部分位置嵌入Html网页

    <div align="center" style="margin:0 auto;"> <div style="width:500p ...