事件冒泡


  事件冒泡是事件流的第三個階段,通過事件冒泡可以在這個階段對事件做出響應。

  關於冒泡,事件對象中包含bubblescancelBubblestopPropagation()stopImmediatePropagation()這四個屬性和方法。


 

  bubbles屬性返回一個布爾值,表示當前事件是否會冒泡。該屬性為只讀屬性。

  發生在文檔元素上的大部分事件都會冒泡,但focus、blur和scroll事件不會冒泡。所以,除了這三個事件bubbles屬性返回了false外,其它事件該屬性都為true。

    <button id="test" style="height: 30px;width: 200px;"></button>
    <script>
        //點擊按鈕時,按鈕內容為true,說明click事件默認可冒泡
        var test = document.getElementById('test');
        test.onclick = function(e){
            test.innerHTML =e.bubbles;//true
        }
    </script>

 

    <div id="box" style="height: 50px;width: 200px;overflow:scroll;background:pink;line-height:60px;">內容</div>
    <script>
        //滾動時,div內容變成false,說明scroll事件默認不可冒泡
        var box = document.getElementById('box');
        box.onscroll = function(e){
            test.innerHTML = e.bubbles;//false
        }
    </script>

 

 

 

  


 

stopPropagation()方法表示取消事件的進一步捕獲或冒泡,無返回。不能阻止同一事件的其它監聽函數被調用

  注意:ie8 瀏覽器不支持

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
        </head>
        <body>
            <button id="btn">觸發</button>
            <script type="text/javascript">
                var btn = document.getElementById('btn');
                btn.onclick = function (e){
                    e = e || event;
                    e.stopPropagation();
                    this.innerText = '阻止冒泡';
                }
                document.body.onclick = function (e){
                    alert('冒泡');
                }
            </script>
        </body>
    </html>

 

 

 

 


 

 

  stopImmediatePropagation()方法不僅可以取消事件的進一步捕獲或冒泡,而且可以阻止同一個事件的其他監聽函數被調用,無返回值

  [注意]IE8-瀏覽器不支持

  使用stopIPropagation()方法,可以阻止冒泡,但無法阻止同一事件的其他監聽函數被調用

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
        </head>
        <body>
            <button id="btn" style="width: 200px;">觸發</button>
            <script type="text/javascript">
                var btn = document.getElementById('btn');
                // 可以阻止冒泡,但無法阻止同一事件的其他監聽函數被調用
                btn.addEventListener('click',function (e){
                    e = e || event;
                    e.stopPropagation()
                    this.innerHTML = '修改了';
                })
                btn.addEventListener('click',function (e){
                    e = e || event;
                    this.style.backgroundColor = 'lightblue';    //使用stopIPropagation(),該函數還會執行
                })
                document.body.addEventListener('click',function (){
                    alert('body');                      //使用stopIPropagation(),該函數不執行
                })
            </script>
        </body>
    </html>

 

 

使用stopImmediatePropagation()方法,即可以阻止冒泡,也可以阻止同一事件的其他監聽函數被調用

 

    <button id="btn" style="width: 200px;">觸發</button>
    <script type="text/javascript">
        var btn = document.getElementById('btn');
        // 可以阻止冒泡,但無法阻止同一事件的其他監聽函數被調用
        btn.addEventListener('click',function (e){
            e = e || event;
            e.stopImmediatePropagation()
            this.innerHTML = '修改了';
        })
        btn.addEventListener('click',function (e){
            e = e || event;
            this.style.backgroundColor = 'lightblue';      //使用stopImmediatePropagation()方法,該函數不執行
        })
        document.body.addEventListener('click',function (){
            alert('body');                       //使用stopImmediatePropagation()方法,該函數不執行
        })
    </script>

 

 

 

 


 

canceBubble屬性只能用於阻止冒泡,無法阻止捕獲階段。該值可讀寫,默認值為false。當設置為true是,cancelBubble可以取消事件冒泡

[注意]該屬性全瀏覽器支持,但並不是標准寫法

 

    <button id="btn">觸發</button>
    <script type="text/javascript">
        var btn = document.getElementById('btn');
        btn.onclick = function (e){
            e = e || event;
            e.cancelBubble = true;
            this.innerText = '阻止冒泡';
        }
        document.body.onclick = function (e){
            alert('冒泡');
        }
    </script>

 

 

 

 


阻止事件冒泡的兼容性寫法

 

    var handler = function(e){
        e = e || event;
        if(e.stopPropagation){
            e.stopPropagation();
        }else{
            e.cancelBubble = true;
        }
    }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM