9-14 程宗武

9-14(事件)

一、事件冒泡

 <div id="wrap1">
        <div id="wrap2">

        </div>
 </div>
    <script type="text/javascript">
        var wrap1 = document.getElementById("wrap1")
        var wrap2 = document.getElementById("wrap2")
        wrap1.onclick = function(){
            console.log("我是wrap1")
        }
        wrap2.onclick = function(e){
            console.log("我是wrap2")
            //e.stopPropagation();-->可以在子元素中使用e.stopPropagation()方法阻止冒泡向父元素蔓延,此方法需要传入一个形参e(此时的形参e相当于一个事件对象,因为事件对象默认作为处理函数的第一个对象传入,因此实际上调用的是事件对象(click)中停止冒泡的方法)
        }
    </script>
    //这个事件的执行经历了以下三个阶段
    1、捕获
        首先由内向外,记录绑定了的事件处理函数 -->捕获了wrap1、wrap2的处理函数
    2、触发
        首先触发目标元素上的函数(如果目标元素是子元素,则优先执行子元素上的函数-->wrap2)
    3、冒泡
        由内向外依次执行捕获了的函数(先执行了wrap2,再执行wrap1) 注意:当父元素和子元素都绑定了同一个事件时,才会触发冒泡,例如都绑定了onclick事件。如果绑定的为不同的事件,则冒泡不会蔓延
    因此输出的结果为-->我是wrap2-->我是wrap1

事件冒泡会产生的问题

事件在进行触发时,会首先遍历所有绑定事件了的对象以处理函数,如果事件监听的越多,则遍历的时间也会相应的增加,因此事件的响应也就会越慢。

如何解决

如果有多个平级的事件需要绑定相同的事件监听,则只需要在父元素绑定一次

实例:

 <div id="list">
       <input type="text" id="result"><br>
       <input type="button" value="1">
       <input type="button" value="2">
       <input type="button" value="3">
       <input type="button" value="+"><br>
       <input type="button" value="4">
       <input type="button" value="5">
       <input type="button" value="6">
       <input type="button" value="-"><br>
       <input type="button" value="7">
       <input type="button" value="8">
       <input type="button" value="9">
       <input type="button" value="*"><br>
       <input type="button" value="0">
       <input type="button" value="C">
       <input type="button" value="=">
       <input type="button" value="/"><br>
    </div>
var list1 = document.getElementById("list")
        var result1 = document.getElementById("result")
        var sum = ""
        var sum1 =""
        list.onclick = function(e){
            if(e.target.nodeName =='INPUT'){
                console.log(e.target.value)
                switch(e.target.value){
                    case "C":
                        result1.value = ""
                        break;
                     case "=":
                           if(result1.value !==""){
                               result1.value = eval(result1.value)
                           }
                    default:
                        if(result1.value.indexOf("+")==-1){
                            result1.value += e.target.value.replace("=","") 
                        }
                }
            }
        }
//参数e对应的是click事件对象对应的是list中对应的被点击的目标元素

评论


© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1