添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

这次给大家带来如何使用JS事件代理,如何使用JS事件代理的注意事项有哪些,下面就是实战案例,一起来看一下。

事件委托 (也叫 事件代理 ),其实这个问题也简单,要想弄明白事件委托,我们先要把事件冒泡的机制搞清楚。举个事件冒泡的例子:

登录后复制
登录后复制
<script> var ul=document.getElementsByTagName(&#39;ul&#39;)[0]; var li=document.getElementsByTagName(&#39;li&#39;)[0]; ul.addEventListener(&#39;click&#39;, function(){ alert(&#39;我是ul,我被点击了&#39;); }, false); li.addEventListener(&#39;click&#39;, function(){ alert(&#39;我是li,我被点击了&#39;); }, false); </script>

在这段代码中,当我们点击li的时候出发了li的click事件,但是在这时,ul的click事件也被触发了,这就是事件的冒泡。搞明白这个之后,我们就可以来说事件委托了,既然事件能从子元素(li)冒泡的父元素(ul)身上,那么我们就可以给ul自己加一个click事件,把所有li的事件都委托给了我们的父级(ul)身上,可能到这里有些朋友还是不明白这个事件委托到底有什么用,我们在举一个事件委托的实例来说明一下:

登录后复制
登录后复制
<script> //使用事件委托的代码 var ul=document.getElementsByTagName(&#39;ul&#39;)[0]; ul.addEventListener(&#39;click&#39;, function(e){ alert(e.target.innerHTML); }, false); //不使用事件委托,循环给li添加click事件 var li=document.getElementsByTagName(&#39;li&#39;) for(var i=0;i<li.length;i++){ li[i].onclick=function(){ alert(this.innerHTML); </script>

我们以上代码把事件委托给了ul,只给ul增加点击事件,在浏览器中运行点击对应的li会弹出li对应的 innerHTML ,这个 function(e){}; 中的e这个参数实际上就是当前我们点击li时,系统传给我们的一些事件信息, e.target 实际上指的就是当前我们点击的这个li,在这里我们每次弹出的都是当前点击对象的 innerHTML ,这就是一个简单的事件委托的案例。

而事件委托对于我们优化代码意义是非常大的,我们都知道,频繁的dom操作是非常耗费性能的,现在ul里边是5个li,我们假如不用事件委托实现上面代码所作的事情,就需要用for循环,给每个li都写一个click事件,这样一来dom操作就比较多了,如果是10个li呢,100个甚至更多呢,单不说dom操作影响的性能,li过多for循环自身就会占用大量的事件。如果利用事件委托,既避免了for循环耗费的性能,又省去了繁多的dom操作耗费的性能。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

Webpack怎样操作缓存

如何使用Bootstrap+WebUploader

以上就是如何使用JS事件代理的详细内容,更多请关注php中文网其它相关文章!

MySQL:从聚合结果中检索分组行的总和 假设我有每个国家用户访问次数的统计:查询如下:SELECTcountries_users.user_id,countries.name,count(countries_users.... P粉978742405来自于2024-02-26 23:21:28 寻找模式的多个出现,使用正则表达式 我得到了这个字符串:if(条件A==值A-AND-条件B==值B-OR-条件C==值C)我想要一个包含以下内容的数组:array(3){[0]=>string(...)&qu... P粉186017651来自于2024-02-26 23:27:41 如何允许chrome扩展访问他的路径和文件 我正在制作Opera扩展,我想获取存储在扩展路径中的一些图像。该插件的作用是,在特定网页上,将背景图像URL和一些图标更改为扩展程序内的自定义图标。但是,当我运行脚本时,所有内容都... P粉644981029来自于2024-02-26 23:12:34 使用“可见值”选项进行选择后导航到下一页 我正在尝试使用HTML创建一种流程(代码在底部)我选择“Cisco”,然后进入下一个框供我选择类型,我选择“PE路由器”,然后进入下一组选项,选择设备,依此类推,直到完成我如何创建... P粉351138462来自于2024-02-26 22:45:32 解释为表单中的动画图像元素提交的图像坐标 我想通过检查php$_POST数组来捕获指示用户单击动画图像的位置的X:Y值。问题是,虽然我可以获取静态图像上的输入提交信息,但我似乎无法从动画图像中获取任何值。以下是演示此行为的... P粉421119778来自于2024-02-26 22:34:14 无法在我的创建模块中显示类别图像 我想在我自己的模块中显示caregory图像,所以我创建了一个模块和frontend/templates/category-section.phtml,这是代码,我的问题是源图像是... P粉731977554来自于2024-02-26 22:31:22 如何从另一个js文件激活我的nodejs功能? 我有一个数据库,其中存储了登录我网站的所有用户,并希望他们能够删除他们的帐户。所以我做了一个可以工作的函数,可以删除用户的accs,但我遇到的唯一问题是我似乎无法将具有按钮事件侦听... P粉833546953来自于2024-02-26 22:35:53 ErrorException 尝试获取属性“nom_service”非对象的 请帮助我尝试了最大的方法但没有结果,我是Laravel的初学者!!!liste.blade.php<td>{{$data->candidature->dem... P粉662089521来自于2024-02-26 22:38:44 在 dash 应用程序中,如何交换不同容器的内容? 我在做以下事情时遇到了很大的困难。我有一个由css格式化的破折号应用程序,以显示在不同的容器中。标记为“hexgrid-1-container”的容器是最大的容器,而其他容器较小,... P粉378890106来自于2024-02-26 22:35:55 如何在MySQLWorkBench中指定日期函数以避免错误提示? 我尝试创建一个表,这就是我的设置方式:CREATETABLEemp_tab(empnoNUMeric(10),nameVARCHAR(50)NOTNULL,jobVARCHAR(5... P粉245003607来自于2024-02-26 21:56:48