js中的事件委托

本文通过制作扫雷游戏的过程,详细介绍了事件委托的概念及其在提高代码执行效率方面的作用。作者最初面临为大量雷区小块绑定点击事件的难题,通过事件委托实现了仅需在雷区绑定事件,利用事件对象的target属性判断点击目标,从而简化代码并提升性能。

今天来说说js中的事件委托,我为啥会接触到事件委托这个东西呢?它到底是个啥?

这个故事还得从两年前我还在上学那会儿说起,那个时候刚开始学js,谋划着想用js来做一个扫雷,但是到了给一个个用来代表雷区的小块来做点击事件的时候犯难了,因为根据选择难度的不同,雷区的区域大小不同,里面的小块数量也不同,点击每一个小块,都要把他翻开,给每一个小块都去绑定一个点击事件,这也不是个事,当时做出来的样子是这样的

苦苦找寻了许久,终于听到了一个名词 事件委托,然而具体是如何实现的呢

  在这里 我们需要想到一件事 ,那就是当我们点击了雷区中的小块,我们不也点击了雷区嘛。所以,我们不用去给每个小块绑定点击事件,而是把点击事件绑定到雷区上面,然后在点击事件里面,我们再去判断,他点了谁,这个可以用事件对象中的target属性来判断。 具体的实现是这样的。

//为雷区绑定点击事件并传入时间对象
document.getElementById("BoomArea").addEventListener('click',function(e){ 
	 //兼容事件对象
	 var e=e || window.event
	 //判断是否点击了雷块  雷块 class = boom
	 if(e.target.className == 'boom'){
	 	//如果点击了雷块 我们就去获取他的id      id生成规则   'boom'+序号
	 	var boom=document.getElementById(e.target.id);
	 	//这样我们就可以来做翻开这个小块的操作了 
	 }
});

至此,关于扫雷的时候点击雷块的问题就解决了,至于扫雷小游戏的其他细节,以后再慢慢说

用事件委托和jquery的class选择器绑事件来 对比一下

   上面的操作我们用jquery来给class是boom的类来绑定点击事件,是不靠谱的,在jquery绑定了点击事件之后生成的雷块,是响应不到点击事件的,除非你又重新绑定一次点击事件,这样会出现不必要的麻烦

用事件委托的话 就是一个一劳永逸的办法,之后生成的雷块照样会响应点击事件。

如果不用事件委托的话  当我们的雷块有成百上千个后,代码的执行效率就被慢慢的拉下去了。

好了今天就扯到这了。。睡觉 。。

 

<think> 首先,用户的问题是:“我想了解JavaScript中事件委托的原理 请问JavaScript中事件委托的原理”。这是一个关于JavaScript事件委托原理的查询。 从系统级指令看: - 所有行内数学表达式必须使用$...$格式,但这个主题是JavaScript事件委托,不涉及数学表达式,所以这条可能不适用。 - 独立公式必须使用$$...$$格式并单独成段,同样,这里没有公式。 - LaTeX语法正确:由于没有数学内容,不需要。 - 使用中文回答:是的,必须用中文。 - 生成相关问题:指令中说“生成相关问题”,并且有示例显示在回答末尾添加相关问题。 - 回答中引用的段落末尾自然地添加引用标识:引用来自提供的引用[1]到[4],所以我需要在回答中引用这些来源时添加标识,如[^1]、[^2]等。 用户提供的引用: - [^1]: 事件委托也叫事件代理,利用事件冒泡,只指定一个事件处理程序管理某一类型的所有事件。 - [^2]: 事件委托是利用事件冒泡机制,将子元素事件统一委托给父元素,减少事件监听器数量,提升性能,支持动态元素绑定。 - [^3]: 事件委托原理基于事件冒泡,事件从最深节点向上传播;示例说明给父元素加事件处理程序可以处理子元素事件。 - [^4]: 事件委托解决为大量动态DOM元素绑定事件的问题,减少性能负担和代码复杂性。 用户的问题是“JavaScript中事件委托的原理”,所以我需要基于这些引用解释原理。 结构化回答: - 回答应该结构清晰,帮助用户逐步解决问题。 - 尽可能保证真实可靠,基于提供的引用。 关键原理: - 事件委托的核心是事件冒泡机制。 - 事件从目标元素向上冒泡到父元素。 - 通过将事件处理程序绑定到父元素,而不是每个子元素,来处理多个子元素的事件。 - 这样可以减少事件监听器的数量,提高性能,尤其是对于动态添加的元素。 步骤构建回答: 1. 引入概念:什么是事件委托(基于引用[1]和[^4])。 2. 解释原理:事件冒泡机制(基于引用[^3])。 3. 描述优点:减少监听器、提升性能、支持动态元素(基于引用[^2]和[^4])。 4. 给出简单示例:可能参考引用[^3]中的代码示例。 5. 添加引用标识:在相关部分末尾自然添加[^1]、[^2]等。 6. 生成相关问题:在末尾添加相关问题。 相关问题生成: - 类似示例中的快速排序问题列表。 - 基于主题,如:事件委托的应用场景、如何实现事件委托事件委托事件冒泡的关系等。 完整回答结构: - 开头简要介绍事件委托。 - 详细解释原理。 - 讨论优点和为什么使用它。 - 结束语。 - 相关问题部分。 确保语言清晰、中文。 </think> ### JavaScript中事件委托的原理 事件委托(也称为事件代理)是JavaScript中一种高效的事件处理技术,其核心原理基于DOM事件中的**事件冒泡机制**。下面我将逐步解释事件委托的原理、工作原理和优势,确保内容清晰易懂。 #### 1. **事件冒泡机制的核心原理** - 在DOM(文档对象模型)中,当一个事件(如点击事件)在子元素上触发时,它会沿着DOM树从目标元素向上“冒泡”到父元素,直至文档根节点[^3]。例如,对一个嵌套结构 `div > ul > li > a`: - 当点击 `a` 元素时,事件会依次冒泡到 `li`、`ul`、`div`。 - 事件委托就是利用这个特性:将事件处理程序绑定到父元素(如 `ul` 或 `div`),而不是绑定到每个子元素(如 `li` 或 `a`)。当子元素事件发生时,它会自动冒泡到父元素,父元素的事件处理程序可以捕获并处理该事件[^1][^3]。 #### 2. **事件委托的工作原理** - **统一处理代替逐个绑定**:传统方法是为每个子元素单独绑定事件监听器(例如,为每个 `li` 元素添加点击处理函数)。这会导致大量监听器,增加内存消耗和性能开销。事件委托则只在父元素上设置一个监听器,通过事件对象的 `event.target` 属性来判断事件源,从而决定如何处理[^2][^4]。 - 示例代码(基于引用[^3]的简化版本): ```html <body> <ul id="myList"> <li>111</li> <li>222</li> <li>333</li> </ul> <script> document.getElementById('myList').addEventListener('click', function(event) { if (event.target.tagName === 'LI') { // 检查事件源是否为li元素 console.log('Clicked item: ' + event.target.textContent); // 输出被点击的li内容 } }); </script> </body> ``` - 在这个示例中,父元素 `ul` 委托处理所有子元素 `li` 的点击事件。当用户点击任何 `li` 时,事件冒泡到 `ul`,事件处理程序通过 `event.target` 识别具体被点击的 `li`,避免了为每个 `li` 单独绑定的麻烦[^3][^4]。 #### 3. **事件委托的优势** - **减少事件监听器数量**:只需一个父元素监听器,就能管理所有子元素的事件,显著减少内存占用和性能开销(尤其在数百或数千个元素的场景下)[^2][^4]。 - **支持动态元素**:对后续动态添加的元素(如通过JavaScript添加的新 `li`),事件委托自动生效,无需重新绑定,因为事件冒泡机制始终有效[^1][^2]。 - **增强代码可维护性**:逻辑集中在父元素的一个处理程序中,便于调试和扩展,避免代码分散[^2][^4]。事件委托也简化了事件处理,避免了事件处理程序的重复设置。 #### 总结 事件委托的原理本质上是通过事件冒泡,将子元素的事件处理“委托”给父元素统一管理。这不仅优化了性能,还提升了代码的灵活性和可维护性。在实际开发中,事件委托常用于列表、菜单、表格等需要处理多个相似元素的场景[^1][^2][^4]。 如需深入了解事件委托的应用或优化技巧,可以参考相关文档或资源。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值