LuckyWinty / fe-weekly-questions

A pro to record some interview questions every week...
MIT License
341 stars 34 forks source link

说说事件委托 #72

Open LuckyWinty opened 4 years ago

LuckyWinty commented 4 years ago

事件委托, 现实意义上讲是指将自己的事务嘱托他人代为处理。js中是 允许我们不必为某些特定的节点添加事件监听器,而是将事件监听器添加到(这些节点的)某个 parent节点上。利用事件冒泡,去找到匹配的子节点元素,然后做出相应的事件响应。是主要用来解决“事件处理程序过多”这个问题的。 经典例子:ul 里面的li的事件绑定。

window.onload = function(){
  var oUl = document.getElementById("ul");
  var aLi = oUl.getElementsByTagName("li");

/*
这里要用到事件源:event 对象,事件源,不管在哪个事件中,只要你操作的那个元素就是事件源。
ie:window.event.srcElement
标准下:event.target
nodeName:找到元素的标签名
*/
  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";
    }
  }

好处: 1, 简化了初始化的过程,减少了多余的事件处理函数,进而节省了内存。提高性能。 2,新添加的元素还会有之前的事件。

缺点:

gdutwyg commented 4 years ago

利用事件冒泡,去找到匹配的子节点元素

这句话感觉怪怪的

LuckyWinty commented 4 years ago

不怪吧

周文婷 邮箱:18814127231@163.com

签名由 网易邮箱大师 定制

在2020年08月12日 16:21,wyg 写道:

利用事件冒泡,去找到匹配的子节点元素

这句话感觉怪怪的

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.

gdutwyg commented 4 years ago

不怪吧 | | 周文婷 邮箱:18814127231@163.com | 签名由 网易邮箱大师 定制 在2020年08月12日 16:21,wyg 写道: 利用事件冒泡,去找到匹配的子节点元素 这句话感觉怪怪的 — You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.

事件冒泡,应该是子元素冒泡到父元素,由里向外; 你这里说“利用事件冒泡,去找到匹配的子节点元素”,我理解成父元素利用事件冒泡,找到匹配的子元素,所以感觉有点怪怪的

gyt95 commented 4 years ago

我对事件委托的理解同样是把对目标元素的事件,绑定在目标元素的父元素上。当点击这些目标元素时,会通过事件冒泡,从子元素冒泡到父元素,触发在父元素上绑定了的事件。

应用场景我也想到ul里的li事件绑定,但是我想到的是事件委托用于解决“当目标元素需要动态添加到页面中时”的问题。即当前页面并不存在该目标元素。

例如一个ul列表,当前是空的。需要获取数据再以<li>item1</li>的形式appendChild的话,那么就会先通过事件委托,把事件绑定在父元素ul上,等到ul中有li数据后,点击li,冒泡,触发ul事件。

不知道我的说法是否正确。仅交流观点。