这次给大家带来如何使用JS事件代理,如何使用JS事件代理的注意事项有哪些,下面就是实战案例,一起来看一下。
事件委托
(也叫
事件代理
),其实这个问题也简单,要想弄明白事件委托,我们先要把事件冒泡的机制搞清楚。举个事件冒泡的例子:
<script>
var ul=document.getElementsByTagName('ul')[0];
var li=document.getElementsByTagName('li')[0];
ul.addEventListener('click', function(){
alert('我是ul,我被点击了');
}, false);
li.addEventListener('click', function(){
alert('我是li,我被点击了');
}, false);
</script>
在这段代码中,当我们点击li的时候出发了li的click事件,但是在这时,ul的click事件也被触发了,这就是事件的冒泡。搞明白这个之后,我们就可以来说事件委托了,既然事件能从子元素(li)冒泡的父元素(ul)身上,那么我们就可以给ul自己加一个click事件,把所有li的事件都委托给了我们的父级(ul)身上,可能到这里有些朋友还是不明白这个事件委托到底有什么用,我们在举一个事件委托的实例来说明一下:
<script>
//使用事件委托的代码
var ul=document.getElementsByTagName('ul')[0];
ul.addEventListener('click', function(e){
alert(e.target.innerHTML);
}, false);
//不使用事件委托,循环给li添加click事件
var li=document.getElementsByTagName('li')
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