`

JavaScript事件冒泡和事件委托

阅读更多

http://www.pureweber.com/article/event-delegation/

接触JavaScript不久,学的东西也不是特别多。小雨就是习惯把平时学到的东西拿出来分享。一方面加强自己的印象,一方面可以让自己的经验为他人答疑解惑。我们知道JavaScript可以监控页面上元素的各种事件,常用的事件有很多,例如点击,鼠标移入、移出,元素改变等等。这次主要说一下事件冒泡及其一个比较酷的应用,事件委托。不做特殊说明,以下都在jQuery框架内执行。

事件冒泡

什么是“事件冒泡”呢?假设这里有一杯水,水被用某种神奇的方式分成不同颜色的几层。这时,从最底层冒出了一个气泡,气泡会一层一层地上升,直到最顶层。而你不管在水的哪一层观察都可以看到并捕捉到这个气泡。好了,把“水”改成“DOM”,把“气泡”改成“事件”。这就是“事件冒泡”。

为了可以直观地观察到这一现象,我写了一个小程序。这个页面中一共有4个嵌套的正方形。最大的那个在最顶层,最小的那个在最底层。我为每一层都单独绑定了一个点击事件,当这一层被点击时,会为这层涂色。试试看,点击最小的正方形会发生什么?点击其他的又会发生什么呢? (点击这里查看demo)

CSS

.white{background-color:#fff;}
#d1{width:400px;height:400px;border:1px solid #000;margin:50px 50px;}
#d2{width:300px;height:300px;border:1px solid #000;margin:50px 50px;}
#d3{width:200px;height:200px;border:1px solid #000;margin:50px 50px;}
#d4{width:100px;height:100px;border:1px solid #000;margin:50px 50px;}

HTML

<div id="d1" class="white">
    <div id="d2" class="white">
        <div id="d3" class="white">
            <div id="d4" class="white"></div>
        </div>
    </div>
</div>
<button id="reset1">重置</button>

Javascript

jQuery('#d4').click(function(){jQuery(this).css('background-color', 'yellow')});
jQuery('#d3').click(function(){jQuery(this).css('background-color', 'green')});
jQuery('#d2').click(function(){jQuery(this).css('background-color', 'blue')});
jQuery('#d1').click(function(){jQuery(this).css('background-color', 'red')});
jQuery('#reset1').click(function(){jQuery('.white').css('background-color', '#fff')});

没错,点击最小的那个,外面所有的都会被上色。你会发现,点击里层的正方形,外层所有的正方形都会被上色。因为它们也都捕捉到了点击事件。看,他们抓到“气泡”了!

事件委托

上一节的例子我们做一点小小的修改。气泡带上了某种信息,会告诉其经过的每一层自己是在哪一层产生的。JavaScript的事件确实会带着这个属性。当程序捕获一个事件的时候,它会知道这个事件来自于页面上哪个元素。修改上面的程序,使用事件委托来处理点击事件。当最顶层捕获点击事件时,查看事件来源于哪一层,然后只将那一层涂色。再次点击每一层,查看实际效果。只有当前点击的正方形变色了,其他的都毫无反应。(点击这里查看demo)

jQuery('#d1').click(function(e){
        var t = jQuery(e.target);
        var id = t.attr('id');
        if (id==='d4'){
                t.css('background-color', 'yellow');
        } else if (id==='d3') {
                t.css('background-color', 'green');
        } else if (id==='d2') {
                t.css('background-color', 'blue');
        } else {
                t.css('background-color', 'red');
        }
});

当然,如果你有这样嵌套的页面元素,使用了事件委托,委托到了最顶层,这时需要注意:如果其中某个元素,你不希望它的事件冒泡,那么可以使用某种方式阻止事件的冒泡。在jQuery框架中,可以使用stopPropagation()方法来实现而不必关心浏览器兼容性。

$('#bind').click(function(){
    if ($(this).is(':checked')) {
        $('#d4').bind('click', function(e){
            e.stopPropagation();
            alert('冒泡被阻止,这块将不会改变颜色');
        });
    } else {
        $('#d4').unbind('click');
    }
});

重置后选中“阻止最小的方块的事件冒泡”,再点击最小的方块,看是否变色。显然是不会变色,阻止了冒泡,父层将无法接收到点击事件。

注意事项

事件委托是事件冒泡的一个应用,可以减少绑定元素的个数,也不必担心子节点被替换后可能需要进行重新的事件绑定。因为事件的捕获和后续代码的执行已经完全委托给了其父节点。如果页面中含有大量元素需要绑定事件,这样做会减少事件绑定数量,为浏览器减负,无疑会提高页面性能。

但也有些需要注意的。如果用于捕获事件的节点会在某些情况下return false,而你的一个点击事件未委托给父节点,那么,你可能需要阻止这个节点的事件冒泡来达到正确的目的。例如:我在一个div里面有一些按钮和其他元素。利用事件委托来处理这些按钮的点击,如果不是按钮则return false。这时,错误就出现了。如果其他元素中含有链接,那么链接的点击事件也会被委托给div。然而点击链接,会没有任何反应。解决办法一是在委托的代码中对链接进行处理,二是阻止链接的事件冒泡。

源代码

源代码打包下载

分享到:
评论

相关推荐

    【JavaScript源代码】javascript事件冒泡,事件捕获和事件委托详解.docx

    JavaScript中的事件处理是Web开发中的核心概念,主要涉及事件冒泡、事件捕获以及事件委托。这三种机制在处理用户交互和DOM元素之间的事件时起着至关重要的作用。 1. **事件冒泡**:事件冒泡是事件处理的默认模式,...

    【JavaScript源代码】基于事件冒泡、事件捕获和事件委托详解.docx

    在JavaScript中,事件处理是网页交互的核心部分,而事件冒泡、事件捕获和事件委托则是JavaScript事件模型中的三个重要概念。理解这三个概念对于优化网页性能和编写高效代码至关重要。 事件冒泡是指事件从最深的节点...

    事件冒泡解决方案

    在JavaScript的DOM编程中,事件冒泡是一个非常重要的概念,尤其在处理多级嵌套元素的事件时。事件冒泡是指事件开始...总的来说,理解和掌握事件冒泡以及如何控制它,对于编写高效且可控的JavaScript交互逻辑至关重要。

    利用事件冒泡(Event Bubbling )获取鼠标下的元素属性

    通过深入理解和应用事件冒泡,开发者可以编写更高效、更灵活的JavaScript代码,处理复杂的用户交互场景。在实际开发中,结合事件捕获(Event Capturing)和事件冒泡,可以更好地控制事件流,实现更加精细的事件管理...

    JavaScript之事件委托.pdf

    JavaScript中的事件委托是一种高效处理大量动态元素事件的技术,它的核心思想是将事件监听器绑定到父级元素上,而不是直接绑定到每一个子...理解并熟练运用事件委托,对于提升JavaScript编程水平和项目性能至关重要。

    jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法

    在JavaScript和jQuery中,事件处理有两个关键概念:事件冒泡和事件委托。事件冒泡是指事件从最深的节点开始,然后逐级向上层元素传播事件。事件委托则是利用事件冒泡的特性,将事件处理器绑定到一个父元素上,以此来...

    javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结

    理解这些基本概念后,可以有效地利用JavaScript事件机制实现交互式网页,例如阻止事件冒泡以防止不必要的事件处理,或者使用事件委托来减少内存消耗和提高性能。此外,掌握`addEventListener`的第三个参数(是否阻止...

    JavaScript事件冒泡与事件捕获实例分析

    5、事件委托事件委托是一种利用事件冒泡机制来优化事件处理的方法。当有大量相似元素需要响应同一类型事件时,可以将事件监听器添加到这些元素的共同父元素上,然后根据事件的目标元素(event.target)来判断并执行...

    JavaScript事件冒泡机制原理实例解析

    在DOM事件流中,事件的传播分为三个阶段:事件捕获阶段、处于目标阶段和事件冒泡阶段。事件捕获是从最外层的document对象开始,逐步向目标元素靠近的过程;处于目标阶段是指事件已经到达事件目标本身;事件冒泡则是...

    js之事件冒泡,事件捕获,事件委托

    事件冒泡、事件捕获和事件委托是JavaScript事件模型中的三个重要概念。 首先,事件捕获是一种事件处理机制,它从DOM树的根节点(window对象)开始,向下遍历到目标元素。这种机制使得事件首先在最不具体的节点(即...

    javascript事件详解

    在W3C规范出台之前,JavaScript事件机制在IE和Netscape浏览器中有两种不同的处理方式:冒泡和捕获。IE采用冒泡模型,事件从子元素向上冒泡到父元素;Netscape则采用捕获模型,事件从父元素向下捕获到子元素。W3C标准...

    09JavaScript事件总结.docx

    本文主要总结了JavaScript事件的关键概念。 一、事件 事件是用户与浏览器之间交互的瞬间,例如用户点击按钮、输入文本或者鼠标移动等。JavaScript通过监听这些事件来执行相应的功能。常见的事件包括: 1. `onclick`...

    Javascript事件流(事件捕获、事件冒泡),事件委托(代理)

    Javascript事件流(事件捕获、事件冒泡)–&gt;事件委托(代理) Javascript与HTML之间的交互是通过“事件”实现的。事件,就是文档或浏览器窗口发生的一些特定的交互瞬间,当我们与浏览器中的web页面进行特定的交互时...

    javascript事件查询综合

    一、事件和事件处理 JavaScript事件是指用户或浏览器执行的任何动作,如点击按钮、滚动页面或填写表单。事件处理是监听这些事件并执行相应操作的过程。JavaScript提供了多种方法来绑定事件处理函数,如`...

    JavaScript事件代理和委托详解

    这里介绍一下javascript delegate的用法和原理,以及Dojo,jQuery等框架中delegate的接口。 JavaScript事件代理 事件代理在JS世界中一个非常有用也很有趣的功能。当我们需要对很多元素添加事件的时候,可以通过将...

    观察者模式Vs事件委托Demo

    **在Java中实现事件委托**:虽然Java的标准库并不直接支持事件委托,但可以通过自定义事件和发布/订阅模型来实现类似的功能。例如,可以创建一个事件类,包含事件类型和数据,并使用发布者(Publisher)和订阅者...

    使用JavaScript事件综合查询,js事件大全

    JavaScript事件是Web开发中不可或缺的一部分,它允许我们与用户进行交互,响应用户的操作。这篇综合查询将深入探讨...在实际开发中,结合事件委托、阻止默认行为和事件捕获等技巧,可以提高代码的可维护性和性能。

    【JavaScript源代码】JavaScript给事件委托批量添加事件监听详细流程.docx

    ### JavaScript事件委托详解 #### 一、事件委托概念 **事件委托**是一种常见的JavaScript编程技巧,主要用于优化事件处理。它的核心思想是利用事件冒泡机制,将原本应该绑定在子元素上的事件处理器绑定在其父元素...

    JavaScript事件委托的技术原理 – WEB骇客1

    JavaScript事件委托是一种优化网页性能和管理动态元素的事件处理策略。在传统的事件处理方式中,我们通常会在每个需要响应事件的元素上单独设置事件监听器。然而,这种方法在元素数量较多或者元素动态增删时,可能...

Global site tag (gtag.js) - Google Analytics