You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// 获取 li 列表varliList=document.getElementsByTagName('li')// 逐个安装监听函数for(vari=0;i<liList.length;i++){liList[i].addEventListener('click',function(e){console.log(e.target.innerHTML)})}
当然我们可以用上面的代码来实现, 但是这样开销大,也不够优雅. 怎么办? ==> 事件冒泡
对于这 10 个 li 来说, 无论点击动作发生在哪个 li 上, 点击事件最终都会被冒泡到它们共同的父亲—— ul 元素上去, 所以我们完全可以让 ul 来帮忙感知这个点击事件.
既然 ul 可以帮忙感知事件, 那它能不能帮忙处理事件呢? 能!, 因为我们有e.target. ul 元素 可以通过事件对象中的target属性拿到实际触发事件的那个元素, 针对这个元素分发事件处理的逻辑,做到真正的委托.
原生 DOM 下的事件流
穿梭
路径⭐捕获过程
: 事件从最外层元素开始穿梭
, 逐层穿梭
到最内层元素, 这个过程会持续到事件抵达它目标的元素(也就是真正复发这个事件的元素)为止; 此时事件流就切换到了⭐目标阶段
----事件被目标元素所接收; 然后事件就被回弹
,进入⭐冒泡阶段
,它会沿着来时的路逆流而上, 一层一层再走回去DOM 事件流下的性能优化思路: 事件委托
事件冒泡
li
来说, 无论点击动作发生在哪个li
上, 点击事件最终都会被冒泡到它们共同的父亲——ul
元素上去, 所以我们完全可以让ul
来帮忙感知这个点击事件.ul
可以帮忙感知事件, 那它能不能帮忙处理事件呢?能!
, 因为我们有e.target
. ul 元素 可以通过事件对象中的target属性拿到实际触发事件的那个元素, 针对这个元素分发事件处理的逻辑,做到真正的委托.e.target
这个属性, 它指的就是触发事件的具体目标,记录着事件的源头,所以说,不管咱们的监听函数在哪一层执行,只要我拿到这个e.target
,就相当于拿到了真正触发事件的那个元素.像这样利用事件的冒泡特性,把多个子元素的同一类型的监听逻辑,合并到父元素上通过一个监听函数来管理的行为,就是
事件委托
The text was updated successfully, but these errors were encountered: