DOM相关

2019-12-16  本文已影响0人  zhenghongmo

1. DOM事件模型

DOM事件模型

前半部分,事件从最外面的父div依次传递到最里面的后代div,1-2-3-4这部分我们叫捕获过程。
之后事件又从最里层的后代div逐层传出,4-3-2-1这部分我们叫冒泡过程。

x.addEventListener('click', function(){
  console.log('冒泡')
})

x.addEventListener('click', function(){
  console.log('捕获')
},true)

2. 移动端触摸事件

3. 事件委托

<ul>
    <li><span>点击<span></li>
    <li>点击</li>
</ul>

---------------------------------------------------
//错误版
 ul.addEventListener('click', function(e){
     if(e.target.tagName.toLowerCase() === 'li'){
         fn() // 执行某个函数
     }
 })

//高级版
var elementUl = document.querySelector('ul');
function fn(event) {
    var el = event.target;
    while (el.tagName !== 'LI') {
        if (el === elementUl){
            el =null;
            break;
        }
        el = el.parentNode;//返回當前元素的父节点
    }

    if (el) {
        console.log(el)
    }
}
elementUl.addEventListener('click', fn);

//答案总结
 function delegate(element, eventType, selector, fn) {
     element.addEventListener(eventType, e => {
       let el = e.target
       while (!el.matches(selector)) {
         if (element === el) {
           el = null
           break
         }
         el = el.parentNode
       }
       el && fn.call(el, e, el)
     })
     return element
   }
思路是点击 span 后,递归遍历 span 的祖先元素看其中有没有 ul 里面的 li
上一篇 下一篇

猜你喜欢

热点阅读