参考 MDN:→ https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget/addEventListener
    参看文章:→ 移动Web滚动性能优化: Passive event listeners

    addEventListener 用来页面的监听事件

    常用语法是这样的

    1. target.addEventListener(type, listener, options);
    • 第一个参数表示监听事件类型的字符串
    • 第二个参数一般使用一个函数作为回调
    • 第三个参数可选,一般使用对象表示
    1. <body>
    2. <div class="test">Hello</div>
    3. </body>
    4. <script>
    5. const div = document.querySelector('.test')
    6. div.addEventListener('click',()=>{console.log('我被点击了')})
    7. </script>

    event.preventDefault()event.stopPropagation() 用于阻止默认事件和冒泡事件

    1. <body>
    2. <div class="parent">
    3. <a href="http://www.baidu.com">百度链接</a>
    4. </div>
    5. </body>
    6. <script>
    7. const div = document.querySelector('.parent')
    8. div.addEventListener('click', () => { console.log('我被点击了') })
    9. const aLabel = document.querySelector('a')
    10. aLabel.addEventListener('click', (event) => {
    11. console.log('我要阻止默认事件和冒泡事件')
    12. event.preventDefault()
    13. event.stopPropagation()
    14. })
    15. </script>

    点击 a 标签后,它不会跳转页面,也不会把点击事件传递给它的父元素

    我们看一看触发事件后的「target」属性和「currentTarget」属性,这里监听父元素,因为冒泡事件的存在,当子元素被点击时,也会触发事件

    1. <body>
    2. <div class="parent">父元素
    3. <div class="son">子元素</div>
    4. </div>
    5. </body>
    6. <script>
    7. const parent = document.querySelector('.parent')
    8. const son = document.querySelector('.son')
    9. parent.addEventListener('click', (event) => {
    10. console.log(event.target)
    11. console.log(event.currentTarget)
    12. })
    13. </script>

    这里有一个结论:event.currentTarget 是被监听的元素,event.target 是触发事件的元素

    • 当点击子元素时,event.target 为子元素,event.currenTarget 为父元素
    • 当点击父元素时,event.target 为父元素,event.currenTarget 为父元素

    「passive」用于提升移动端的性能

    passive 设置为 true 时,表示 listener 永远不会调用 preventDefault(),如果 listener 仍然调用了这个函数,客户端将会忽略它并抛出一个控制台警告

    原理是这样的,当 passive 为默认值 false 时,浏览器会额外耗费一定时间检查是否调用了 preventDefault() ,passive 设置为 true 明确告诉浏览器,我不调用 preventDefault(),从而提升了性能

    「@浪里淘沙的小法师」