js事件委托及其原理
来源:互联网 发布:张龙java视频 编辑:程序博客网 时间:2024/05/22 13:15
先放段代码 ,便于自己以后查阅,正题在下面
<script> $(function(){ $(".item").on("click","ul",function(e) { // e.target是被点击的元素! // 如果被点击的是li元素 console.log("触发元素为:"); console.log(e.target); console.log("当前冒泡的元素为:"); console.log(e.currentTarget); e.target.style.background="red"; }); });</script><body><div class="item"> <ul> <li>第一</li> <li>第二</li> <li>第三</li> </ul> <ul > <li>第1</li> <li>第2</li> <li>第3</li> </ul></div></body>
正题:
什么是事件委托:
通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件。
也就是:利用冒泡的原理,把事件加到父级上,触发执行效果。
好处呢:
1.提高性能。
我们可以看一个例子:需要触发每个li来改变他们的背景颜色。
<ul id="ul"> <li>aaaaaaaa</li> <li>bbbbbbbb</li> <li>cccccccc</li></ul>
<script>window.onload = function(){ var oUl = document.getElementById("ul"); var aLi = oUl.getElementsByTagName("li"); for(var i=0; i<aLi.length; i++){ aLi[i].onmouseover = function(){ this.style.background = "red"; } aLi[i].onmouseout = function(){ this.style.background = ""; } }}</script>
这样我们就可以做到li上面添加鼠标事件。
但是如果说我们可能有很多个li用for循环的话就比较影响性能。
下面我们可以用事件委托的方式来实现这样的效果。html不变
<script>window.onload = function(){ var oUl = document.getElementById("ul"); var aLi = oUl.getElementsByTagName("li");/*这里要用到事件源:event 对象,事件源,不管在哪个事件中,只要你操作的那个元素就是事件源。事件委托一般用: (jquery委托的目标).on("事件名称","需要委托的dom元素",function(e){……//执行的函数体})来绑定。其中:e.currentTarget表示需要委托dom元素e.target表示触发事件的dom元素委托的目标一般为需要委托的所有元素共有的父元素*/ oUl.onmouseover = function(ev){ var ev = ev || window.event; var target = ev.target || ev.srcElement; //alert(target.innerHTML); if(target.nodeName.toLowerCase() == "li"){ target.style.background = "red"; } } oUl.onmouseout = function(ev){ var ev = ev || window.event; var target = ev.target || ev.srcElement; //alert(target.innerHTML); if(target.nodeName.toLowerCase() == "li"){ target.style.background = ""; } }}</script>
好处2,新添加的元素还会有之前的事件。
我们还拿这个例子看,但是我们要做动态的添加li。点击button动态添加li
如:
- aaaaaaaa
- bbbbbbbb
- cccccccc
不用事件委托我们会这样做:
window.onload = function(){ var oUl = document.getElementById("ul"); var aLi = oUl.getElementsByTagName("li"); var oBtn = document.getElementById("btn"); var iNow = 4; for(var i=0; i<aLi.length; i++){ aLi[i].onmouseover = function(){ this.style.background = "red"; } aLi[i].onmouseout = function(){ this.style.background = ""; } } oBtn.onclick = function(){ iNow ++; var oLi = document.createElement("li"); oLi.innerHTML = 1111 *iNow; oUl.appendChild(oLi); }}
这样做我们可以看到点击按钮新加的li上面没有鼠标移入事件来改变他们的背景颜色。
因为点击添加的时候for循环已经执行完毕。
那么我们用事件委托的方式来做。就是html不变
window.onload = function(){ var oUl = document.getElementById("ul"); var aLi = oUl.getElementsByTagName("li"); var oBtn = document.getElementById("btn"); var iNow = 4; oUl.onmouseover = function(ev){ var ev = ev || window.event; var target = ev.target || ev.srcElement; //alert(target.innerHTML); if(target.nodeName.toLowerCase() == "li"){ target.style.background = "red"; } } oUl.onmouseout = function(ev){ var ev = ev || window.event; var target = ev.target || ev.srcElement; //alert(target.innerHTML); if(target.nodeName.toLowerCase() == "li"){ target.style.background = ""; } } oBtn.onclick = function(){ iNow ++; var oLi = document.createElement("li"); oLi.innerHTML = 1111 *iNow; oUl.appendChild(oLi); }}
阅读全文
0 0
- js事件委托及其原理
- js事件委托及其原理
- js的事件的三个阶段,事件委托的原理
- 事件委托技术原理和使用(js,jquery)
- 事件委托技术原理和使用(js,jquery)
- 事件委托原理
- 事件委托原理理解
- 委托与事件及其应用
- JS模拟事件委托。。。
- JS事件委托
- js 事件委托
- js 事件委托
- 【javascript】js事件委托
- js中的事件委托
- js事件委托
- js中的事件委托
- js 事件委托
- js事件委托
- 三丶java流程控制语句,算法,方法定义
- GCD HDU
- UVA 11995 I Can Guess the Data Structure! (STL的基本操作)
- Nginx文档-初学者指南
- PAT乙级 1065. 单身狗(25)
- js事件委托及其原理
- CSU-ACM2017暑假集训比赛1 C
- 二进制,十进制,十六进制互相转化
- 笔记本问题的解决方案
- BIOS启动报警声全集
- 博弈论(一):Nim游戏
- android 自定义view 画饼图
- “只进结果集不支持请求的操作”的解决方法
- Windows8远程桌面提示|“凭证不工作”解决方案