
事件委托
发布日期:2021-05-06 19:35:29
浏览次数:22
分类:精选文章
本文共 2529 字,大约阅读时间需要 8 分钟。
1. 概念
事件委托:利用冒泡的原理,把事件加到父级上,触发执行效果,如下所示:
window.onload=function(){ var oUl=document.getElementById('ul1'); var aLi=document.getElementsByTagName('li'); oUl.onclick=function(){ alert(123); }}
- 1111
- 2222
- 3333
- 4444
2. 事件委托的好处
1)提高性能
背景:鼠标移上去的时候背景颜色变红,移开消失。- 1111
- 2222
- 3333
- 4444
普通方法实现
window.onload=function(){ var oUl=document.getElementById('ul1'); var aLi=document.getElementsByTagName('li'); for(var i=0;i
事件委托方法实现
event对象:事件源,不管在哪个事件中,只要你操作的那个元素就是时间源。
ie:window.event.srcElement 标准下:event.target
window.onload=function(){ var oUl=document.getElementById('ul1'); var aLi=document.getElementsByTagName('li'); oUl.onmouseover=function(){ /*通过寻找事件源,可以达到放在哪个li出现那个内容的效果*/ var ev=ev||window.event; var target=ev.target||ev.srcElement; target.style.background='red'; } oUl.onmouseout=function(){ var ev=ev||window.event; var target=ev.target||ev.srcElement; target.style.background=''; }}
上面还有一个bug,就是假如移到了ul标签上,整个ul变红。
nodeName 找到当前元素的标签名,大写
window.onload=function(){ var oUl=document.getElementById('ul1'); var aLi=document.getElementsByTagName('li'); oUl.onmouseover=function(){ var ev=ev||window.event; var target=ev.target||ev.srcElement; if(target.nodeName.toLowerCase()=='li'){ target.style.background='red'; } } oUl.onmouseout=function(){ var ev=ev||window.event; var target=ev.target||ev.srcElement; if(target.nodeName.toLowerCase()=='li'){ target.style.background=''; } }}
2)新添加的元素,还会有之前的事件
背景:点击按钮添加,在后面继续添加li标签,内容也是累加。- 1111
- 2222
- 3333
- 4444
window.onload=function(){ var oUl=document.getElementById('ul1'); var aLi=document.getElementsByTagName('li'); var oInput=document.getElementById('input1'); var iNow=4; for(var i=0;i
注意,上面代码添加新的li后,新添加的li不会有之前的事件效果,即鼠标移上去变红。为了解决这个问题,可以用事件委托。把之前的代码移上来就好了。
window.onload=function(){ var oUl=document.getElementById('ul1'); var aLi=document.getElementsByTagName('li'); var oInput=document.getElementById('input1'); var iNow=4; oUl.onmouseover=function(){ var ev=ev||window.event; var target=ev.target||ev.srcElement; if(target.nodeName.toLowerCase()=='li'){ target.style.background='red'; } } oUl.onmouseout=function(){ var ev=ev||window.event; var target=ev.target||ev.srcElement; if(target.nodeName.toLowerCase()=='li'){ target.style.background=''; } } oInput.onclick=function(){ iNow++; var oLi=document.createElement('li'); oLi.innerHTML=1111*iNow; oUl.appendChild(oLi); }}
发表评论
最新留言
很好
[***.229.124.182]2025年03月28日 20时31分00秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
invalid byte sequence for encoding
2019-03-05
银河麒麟系统配置apt网络源
2019-03-05
第七周 4.12-4.18
2019-03-05
程序设计基础75 tips 广度搜索细节问题
2019-03-05
笨办法学python之数据类型
2019-03-05
笨办法学Python之将对象名的字符串类型,转化成相应对象
2019-03-05
ArduPilot源码极速下载手册(一文告别github慢速问题)
2019-03-05
聊一聊那些应该了解的大佬(飞控,人工智能方向)
2019-03-05
ArduPilot+mavros+gazebo+QGC联合仿真初体验
2019-03-05
px4调试bug--添加mavlink_log_info信息
2019-03-05
redis替换字符串命令
2019-03-05
redis向数组中添加值并查看数组长度
2019-03-05
python3基础梳理11python中模块和包
2019-03-05
JS编写一个函数,计算三个不同数字的大小,按从小到大顺序打印(穷举法)
2019-03-05
mybatis中like的注意
2019-03-05
sqlplus的基本使用
2019-03-05
oracle删除表重复数据
2019-03-05
Oracle删除主表数据
2019-03-05
js中两种定时器,setTimeout和setInterval实现验证码发送
2019-03-05