美文网首页
JavaScript中的冒泡事件

JavaScript中的冒泡事件

作者: 十八岁的天空_b2de | 来源:发表于2019-04-16 10:57 被阅读0次

    事件冒泡机制

    事件冒泡发生的条件:当为多个嵌套的元素设置了相同的事件处理程序,它们将触发事件冒泡机制。在事件冒泡中,最内部的元素将首先触发其事件,然后是栈内的下一个元素触发该事件,以此类推,直到到达最外面的元素。如果把事件处理程序指定给所有的元素,那么这些事件将依次触发。

    举个例子

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <script type="text/javascript" src="js/jquery-1.11.0.js"></script>
    <title>Insert title here</title>
    <style type="text/css">
    .box1 {
        border: green 40px solid;
        width: 300px;
        height: 300px;
        margin: auto;
    }
     
    .box2 {
        border: yellow 40px solid;
        width: 220px;
        height: 220px;
        margin: auto;
    }
     
    span {
        position: relative;
        left: 50px;
        top: 50px;
        background-color: rgba(128, 128, 128, 0.22);
    }
    </style>
     
    <script type="text/javascript">
        window.onload = function() {
            document.getElementById("box1").addEventListener("click",function(event){
                alert("您好,我是最外层div。");
            });
            document.getElementById("box2").addEventListener("click",function(event){
                alert("您好,我是第二层div。");
            });
            document.getElementById("span").addEventListener("click",function(event){
                alert("您好,我是span。");
            });
        }
    </script>
     
    </head>
    <body id="body">
        <div id="box1" class="box1">
            <div id="box2" class="box2">
                <span id="span">This is a span.</span>
            </div>
        </div>
    </body>
    </html>
    

    当你点击span元素的时候 会依次弹出 您好,我是span。 您好,我是第二层div。您好,我是最外层div。 这就是事件冒泡

    解决事件冒泡的方法

    方法一:

    在相应的处理函数内,加入 event.stopPropagation() ,终止事件的广播分发,这样事件停留在本节点,不会再往外传播了。修改上述的script片段:

    
    <script type="text/javascript">
        window.onload = function() {
            document.getElementById("box1").addEventListener("click",function(event){
                alert("您好,我是最外层div。");
                event.stopPropagation();
            });
            document.getElementById("box2").addEventListener("click",function(event){
                alert("您好,我是第二层div。");
                event.stopPropagation();
            });
            document.getElementById("span").addEventListener("click",function(event){
                alert("您好,我是span。");
                event.stopPropagation();
            });
        }
    

    经过这样子处理后就不会依次弹出对话框了 你点哪个才弹哪个

    方法二:

    事件包含最初触发事件的节点引用 和 当前处理事件节点的引用,那如果节点只处理自己触发的事件即可,不是自己产生的事件不处理。event.target 引用了产生此event对象的dom 节点,而event.currrentTarget 则引用了当前处理节点,我们可以通过这 两个target 是否相等。

    <script type="text/javascript">
        window.onload = function() {
            document.getElementById("box1").addEventListener("click",function(event){
                if(event.target == event.currentTarget)
                {
                    alert("您好,我是最外层div。");
                }
            });
            document.getElementById("box2").addEventListener("click",function(event){
                if(event.target == event.currentTarget)
                {
                    alert("您好,我是第二层div。");
                }
            });
            document.getElementById("span").addEventListener("click",function(event){
                if(event.target == event.currentTarget)
                {
                    alert("您好,我是span。");
                    
                }
            });
        }
    </script>
    

    从事件传递上看:方法一在于取消事件冒泡,即当某些节点取消冒泡后,事件不会再传递;方法二在于不阻止冒泡,过滤需要处理的事件,事件处理后还会继续传递

    相关文章

      网友评论

          本文标题:JavaScript中的冒泡事件

          本文链接:https://www.haomeiwen.com/subject/arvvwqtx.html