JavaScript 事件冒泡,事件捕获,事件委托

Posted 过往将来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript 事件冒泡,事件捕获,事件委托相关的知识,希望对你有一定的参考价值。

事件冒泡

  1. 事件冒泡:事件冒泡会从当前触发的事件目标一级一级往上传递,依次触发,直到document为止。由内外的处理事件
  2. 事件捕获:事件捕获会从document开始触发,一级一级往下传递,依次触发,直到真正事件目标为止。由外而内的处理事件
 <!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <style media="screen">
    #box1 { width: 300px; height: 300px; background: blueviolet; }
    #box2 { width: 200px; height: 200px; background: aquamarine; }
    #box3 { width: 100px; height: 100px; background: tomato; }
    div { overflow: hidden; margin: 50px auto; }
  </style>
  <body>
    <div id="box1">
        <div id="box2">
            <div id="box3"></div>
        </div>
    </div>
  </body>
  <script type="text/javascript">
    function sayBox3(event) {
      console.log('你点了最里面的box');
    }
    function sayBox2() {
      // console.log(event)
      // event.stopPropagation();
      console.log('你点了最中间的box');
    }
    function sayBox1() {
        console.log('你点了最外面的box');
    }
    // 事件监听,第三个参数是布尔值,默认false,false是事件冒泡,true是事件捕获 结果为: 你点了最里面的box 你点了最中间的box 你点了最外面的box
   document.getElementById('box3').addEventListener('click', sayBox3, false);
   document.getElementById('box2').addEventListener('click', sayBox2, false);
   document.getElementById('box1').addEventListener('click', sayBox1, true);

  </script>
</html>

阻止事件冒泡

  1. 阻止浏览器默认进行的事件冒泡使用的
    function sayBox3(event) {
     	event.stopPropagation();
        console.log('你点了最里面的box');
    }

事件委托简介

  1. 事件委托:将所有元素的事件绑定委托给同一个父元素,根据事件冒泡捕获机制,可以在父元素绑定事件中获取的触发事件的这个元素,
    <body>
        <div>
            <p>1</p>
            <p>2</p>
            <p>3</p>
            <p>4</p
        </div>
        <script>
            // var p = document.querySelectorAll('p');
            // for ( var i = 0; i < p.length; i++) {
            //     p[i].onclick = function() {
            //         this.style.backgroundColor = 'pink';
            //     }
            // }
    
    
            // 利用事件委托,减少事件数量 
            var div = document.getElementsByTagName('div')[0];
            div.onclick = function(e) {
                var dom = e.target;
                if (dom.tagName.toUpperCase() === 'P') {
                    dom.style.backgroundColor = 'red';
                } else if (dom.tagName.toUpperCase() === 'H1') {
                    dom.style.backgroundColor = 'green';
                }
            }
    
            // 利用事件委托,可以预言未来元素,为新元素绑定事件
            // 创建一个新成员 新创建的元素也可以使用事件委托
            var newH1 = document.createElement('h1');
            newH1.innerHTML = '新的h1';
            div.appendChild(newH1);
        </script>

以上是关于JavaScript 事件冒泡,事件捕获,事件委托的主要内容,如果未能解决你的问题,请参考以下文章

事件冒泡 事件捕获 事件委托

事件流,冒泡,捕获,事件委托

javaScript事件委托

javaScript绑定事件委托 demo

理解js事件冒泡事件委托事件捕获

JavaScript事件委托原理及Jquery中的事件委托