1. 程式人生 > >js事件冒泡和阻止事件冒泡

js事件冒泡和阻止事件冒泡

1,什麼是事件冒泡

有層級關係的一連串的盒子都添加了事件,觸發子盒子的事件是,該子盒子的父級及以上的元素的事件也會被觸發;

如下面的程式碼,當我們點選子盒子dv3時,父盒子dv2,dv1的點選事件也會被觸發,這就是事件冒泡

<head>
    <meta charset="UTF-8">
    <title>事件冒泡</title>
    <style>
        #dv1{
            width: 500px;
            height: 500px;
            background-color: #FF0000;
        }
        #dv2{
            width: 400px;
            height: 400px;
            background-color: lightblue;
        }
        #dv3{
            width: 300px;
            height: 300px;
            background-color: antiquewhite;
        }
    </style>
</head>
<body>
    <div id="dv1">
        <div id="dv2" >
            <div id="dv3"></div>
        </div>
    </div>
    <script src="public.js"></script>
    <script>
        //什麼是事件冒泡
        // 給3個div都新增事件
        my$('dv1').onclick = function(){
            alert("div1事件觸發");
        };
        my$('dv2').onclick = function(){
            alert("div2事件觸發");
        };
        my$('dv3').onclick = function(){
            alert("div3事件觸發");
        };

    //    當點選子集元素  觸發點選事件時候,父級元素的點選事件也會被觸發,這就是 事件冒泡
    </script>
</body>

2,阻止事件冒泡

阻止事件冒泡有兩種方式

1,在要要觸發的點選事件函式中 寫 window.event.cancelBubble = true  這種方法  IE 和谷歌 支援,而火狐不支援

2,在事件處理函式中傳入一個物件引數,  在函式中新增  物件引數.stopPropagation;

 <style>
        #dv1{
            width: 500px;
            height: 500px;
            background-color: #FF0000;
        }
        #dv2{
            width: 400px;
            height: 400px;
            background-color: lightblue;
        }
        #dv3{
            width: 300px;
            height: 300px;
            background-color: antiquewhite;
        }
    </style>
</head>
<body>
    <div id="dv1">
        <div id="dv2" >
            <div id="dv3"></div>
        </div>
    </div>
    <script src="public.js"></script>

    <script>

        my$('dv1').onclick = function(){
            console.log("這是div1");
        };
        my$('dv2').onclick = function(){
            console.log("這是div2");
        };

        //第一種方法;
        // my$('dv3').onclick = function(){
        //     console.log("這是div3");
        //     window.event.cancelBubble = true; // ie  和 谷歌支援
        //     //新增阻止事件冒泡後  點選子盒子  父級盒子的事件不會被觸發
        // };


        //第二種方法
        my$('dv3').onclick = function(e){
            console.log("這是div3");
            e.stopPropagation();//  火狐和谷歌支援  ie不支援
        };


    </script>

3事件的三階段

事件捕獲階段

目標階段

事件冒泡階段

在事件處理函式中傳入一個物件引數,    物件引數.eventPhase  屬性可以判斷事件處於哪個階段  該值為1 則是 事件捕獲階段

2 為目標階段   3位事件冒泡階段,       在addEventListener()方法中 第三個引數可以控制事件的階段,false設定物件為冒泡階段, true設定物件為為捕獲階段 

<body>
    <div id="dv1">
        <div id="dv2" >
            <div id="dv3"></div>
        </div>
    </div>
<script>
    /*
    *
    *
    * 事件有三個階段:
    * 1,事件捕獲階段: 由外到內
    * 2,事件目標階段: 最開始選擇的那個
    * 3,事冒泡階段: 由內到外
    *
    *
    *   事件物件.eventPhase屬性可以檢視事件觸發是所處的階段
    *   它會返回屬性值
    *   1---捕獲階段
    *   2---目標階段
    *   3---事件冒泡階段
    *
    *   addEventListener("事件型別",事件處理函式,控制事件的階段)
    *
    *   控制事件的階段有兩個引數值
    *   false---由內到外
    *   true---由外到內
    *
    *
    *   window.event和引數e都是事件處理引數
    *
    * */
</script>
<script src="public.js"></script>
    <script>
        var arr = [my$('dv1'),my$('dv2'),my$('dv3')];
        for(var i = 0; i < arr.length; i++){
            var obj = arr[i];
            obj.addEventListener("click",function (e) {
                console.log(this.id + '=====' + e.eventPhase)
            },false)
        }
    </script>