JavaScript中的冒泡事件和事件的委派

事件的冒泡

  1. 所谓的冒泡指的就是事件的向上传导,当后代元素上的事件被触发时,其祖先元素的相同时间也会被触发,
  2. 在开发中大部分情况冒泡都是有用的,如果不希望发生时间冒泡可以通过事件对象来取消冒泡
	<body>
        <div id="div" style="width: 100px; height: 100px; background-color: black;">
            <span id="span" style="background-color: yellow;">span</span>
        </div>
	</body>
    <script>
        let div = document.getElementById("div");
        let span = document.getElementById("span");
        span.onclick = function(event){
           //取消冒泡
           // 可以将事件对象的cancelBubble设置为true,即可取消冒泡
           // 不同的浏览器编译时event属性所属不同,有的以响应事件函数形参,有的在window对象中,下面的代码用来解决浏览器的兼容问题
           
           alert("我是一个span");
           event = event || window.event;
           event.cancelBubble = true;
       }
       
        div.onclick = function(){
            alert("我是一个div");
        }
    </script>

事件的委派

  1. 指将事件统一绑定给元素的共同的祖先元素,这样后代元素上的事件被触发时,会一直冒泡到祖先元素, 从而通过祖先的响应函数来处理事件。
  2. 事件委派是利用了冒泡,通过委派可以减少事件绑定的次数,提高程序的性能。

举个例子:点击链接时触发弹出框事件,点击按钮能新创建链接,点击新建的链接依然能触发弹出框事件,点击ul其他部分则不触发

	<body>
        <button id="btn01">添加超链接</button>
	
        <ul id="ul" style="background-color: #bfa;">
            <li><a href="javascript:;" class="link">超链接一</a></li>
            <li><a href="javascript:;" class="link">超链接二</a></li>
            <li><a href="javascript:;" class="link">超链接三</a></li>
        </ul>
    
    </body>
    <script>
        let btn01 = document.getElementById("btn01");
        let ul = document.getElementById("ul");
        
        btn01.onclick = function(event){
            let ul = document.getElementById("ul");
            let li = document.createElement("li");
            li.innerHTML = "<a href='javascript:;' class='link'>新增的超链接</a>";
            ul.appendChild(li);
        }
        ul.onclick = function(event){
            event = event || window.event;
            // target 
            // event中的target表示的触发事件的对象
            console.log(event.target);
            // 如果触发事件的对象是我们期望的元素,则执行,否则不执行
            if(event.target.className == "link"){   // 如果class = "link  box",则无效,可用正则表达式处理
                alert(event.target);
            }
            
        }
    </script>

### JavaScript 事件委托与事件冒泡机制详解 #### 一、事件冒泡简介 在 W3C 的 DOM Level 3 Events 文档中定义了浏览器如何处理事件,其中提到事件传播分为三个阶段:捕获阶段、目标阶段冒泡阶段。当一个事件被触发时,默认情况下它会在 DOM 树上从最顶层节点向目标节点传递(捕获阶段),再由目标节点返回到最顶层节点(冒泡阶段)。大多数现代浏览器默认支持事件冒泡行为[^3]。 #### 二、事件委托的概念 事件委托是一种利用事件冒泡特性的技术手段。通过将事件监听器绑定在一个父级容器而非子元素本身上来实现功能需求。这样做的好处是可以减少内存占用并提高性能,尤其是在动态生成大量子节点的情况下无需逐一为其添加事件处理器。 下面是一个简单的例子展示如何应用事件委派: ```javascript document.getElementById("parent").addEventListener("click", function(event) { if (event.target && event.target.nodeName === "BUTTON") { console.log("Button clicked:", event.target.id); } }); ``` 在这个代码片段里,“parent” 是所有按钮共同的父亲节点。我们只需要给这个父亲节点注册一次点击事件即可响应其内部任意 button 子项的操作,而不需要分别针对每一个单独设置 handler 函数。 #### 三、实际应用场景分析 考虑列表项目删除操作场景下使用事件代理模式可以有效简化逻辑结构: 假设有一个 HTML 列表如下所示: ```html <ul id="list"> <li>Item 1<button class='remove'>Remove</button></li> <li>Item 2<button class='remove'>Remove</button></li> <!-- 更多条目 --> </ul> ``` 如果采用传统方式,则每新增一条记录都需要重新附加对应的移除按键 click listener;但如果运用上述介绍过的事件委派技巧的话就可以统一管理这些交互动作啦! 对应 JS 实现如下: ```javascript const listElement = document.querySelector('#list'); listElement.addEventListener('click', (e) => { const targetBtn = e.target.closest('.remove'); // 找到最近匹配 .remove 类名的祖先标签 if (!targetBtn || !confirm(`Are you sure to delete this item?`)) return; let parentLi = targetBtn.parentElement; // 获取当前按纽所在的 li 节点 parentLi.remove(); // 移除此 li 及其内容 }); ``` 以上就是基于事件冒泡原理所构建出来的高效解决方案实例之一。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值