JavaScript事件委托與事件冒泡

事件委托:

原理:事件委托是最好理解的那個(gè),我們要給每一個(gè)按鈕綁定一個(gè)事件,但是這樣遍歷,太消耗性能了,于是我們直接給父元素綁定即可完成。解決了以下幾個(gè)問(wèn)題:
1、遍歷帶來(lái)的性能問(wèn)題。
2、button如果是動(dòng)態(tài)添加的,那么必須用事件委托。
3、由于事件委托是通過(guò)事件冒泡實(shí)現(xiàn)的,所以如果子級(jí)的元素(e.stopPropagation())阻止了事件冒泡,那么事件委托也將失效!

        <div class="btn-layout">
            <button>按鈕</button>
            <button>按鈕</button>
            <button>按鈕</button>
            <button>按鈕</button>
            <button>按鈕</button>
            <button>按鈕</button>
        </div>
        <script>
            document.getElementsByClassName("btn-layout")[0].onclick = function(e){
                console.log(e);
            }
        </script>

事件冒泡:

事件冒泡,就是點(diǎn)擊最里面的元素,會(huì)觸發(fā)父元素的方法,如下:

        <div id="a">
            最外層的元素
            <div id="b">
                中間的元素
                <div id="c">
                    最里面的元素
                </div>
            </div>
        </div>
        <script>
            document.getElementById("a").onclick = function(){
                console.log("a");
            }
            document.getElementById("b").onclick = function(){
                console.log("b");
            }
            document.getElementById("c").onclick = function(){
                console.log("c");
            }
            /*document.getElementById("a").addEventListener('click', function(){
                console.log('最外層元素 捕獲階段');
            },true);
            document.getElementById("b").addEventListener('click', function(){
                console.log('中間層元素 捕獲階段');
            },true);
            document.getElementById("c").addEventListener('click', function(){
                console.log('最里層元素 捕獲階段');
            },true);
            document.getElementById("a").addEventListener('click', function(){
                console.log('最外層 冒泡階段');
            },false);
            document.getElementById("b").addEventListener('click', function(){
                console.log('中間層 冒泡階段');
            },false);
            document.getElementById("c").addEventListener('click', function(){
                console.log('最里層 冒泡階段');
            },false);*/
        </script>
事件冒泡Demo

點(diǎn)擊最里面的元素后,會(huì)輸出,a,b,c,把父元素的方法也輸出了。解決辦法:

            document.getElementById("c").onclick = function(e){
                e.stopPropagation();
                console.log("c");
            }

把要冒泡的代碼,添加e.stopPropagation();阻止就可以完成,在微信小程序里,把bindTap改成catchTap。

事件流:

事件流包含三個(gè)階段:
事件捕捉階段:事件開(kāi)始由頂層對(duì)象觸發(fā),然后逐級(jí)向下傳播,直到目標(biāo)元素;
處于目標(biāo)階段:處在綁定事件的元素上;
事件冒泡階段:事件由具體的元素先接收,然后逐級(jí)向上傳播,直到不具體的元素;


事件流

事件捕獲是從上到下,而時(shí)間冒泡,是從下到上,是相反的。我們用段代碼來(lái)證明一下:

        <div id="a">
            最外層的元素
            <div id="b">
                中間的元素
                <div id="c">
                    最里面的元素
                </div>
            </div>
        </div>
        <script>
            document.getElementById("a").addEventListener('click', function(){
                console.log('最外層元素 捕獲階段');
            },true);
            document.getElementById("b").addEventListener('click', function(){
                console.log('中間層元素 捕獲階段');
            },true);
            document.getElementById("c").addEventListener('click', function(){
                console.log('最里層元素 捕獲階段');
            },true);
            document.getElementById("a").addEventListener('click', function(){
                console.log('最外層 冒泡階段');
            },false);
            document.getElementById("b").addEventListener('click', function(){
                console.log('中間層 冒泡階段');
            },false);
            document.getElementById("c").addEventListener('click', function(){
                console.log('最里層 冒泡階段');
            },false);
        </script>
事件流Demo

點(diǎn)擊最里面的元素之后,輸出的結(jié)果,果然和事件流流程一模一樣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容