美文网首页
对事件的详解

对事件的详解

作者: 大庆无疆 | 来源:发表于2019-02-24 00:41 被阅读0次
    对同一个事件注册多个事件处理函数

    我们的网页是多人开发的话,如果有一个按钮员工1和员工2都需要进行点击事件处理,他们都各自写了js文件引入到页面中,但是这样是达不到预期的效果,因为前面的会被后面的覆盖掉,所以我们可以有addEventListener()来解决

    事件处理函数
    var btn = my$('btn');
    
    第一种
    onclick:无法给同一个对象的同一个事件注册多个事件处理函数
    
    btn.onclick = function () {
        alert('我是事件1')
    }
    btn.onclick = function () {
        alert('我是事件2')
    }
    只执行'我是事件2',因为第一个被覆盖了
    
    //-----------------------------------------------------------
    第二种
    addEventListener():他可以同时给同一个事件注册多个处理函数
    这个方法虽好,但是有兼容问题,IE9以后才支持
    
    var btn = my$('btn');
    // addEventListener(事件名称, 处理函数)
    btn.addEventListener('click', function () {
        alert("我是事件1");
    })
    
    btn.addEventListener('click', function () {
        alert("我是事件2");
    })
    //点击按钮的时候,先弹出"我是事件1"的窗口,再弹出"我是事件2"的窗口
    //-----------------------------------------------------------------------------------
    第三种
     attachEvent(事件名称(前面加on), 处理函数)  
    也有浏览器兼容问题,IE的老版本特有的方法,不是标准的方法,IE6-IE10支持
    
    btn.attachEvent('onclick', function () {
        alert('我是事件1');
    })
    btn.attachEvent('onclick', function () {
        alert('我是事件2');
    })
    //点击按钮的时候,先弹出"我是事件1"的窗口,再弹出"我是事件2"的窗口
    
    -----------------------------------------------------------
    // 对同一个事件注册多个事件处理函数
    // 处理兼容性(写一个函数)
    //我们的函数的事件名不带on
    function addEventListener(element, eventName, fn) {
        // 判断是否有该方法
        if(element.addEventListener) {
            //如果有该方法则这里
            element.addEventListener(eventName, fn);
        }else if(element.attachEvent) {
            element.attachEvent('on'+ eventName, fn);
        }else {
            element['on' + eventName] = fn;
        }
    }
    
    
    

    注意:addEventListener()中的this是绑定事件的对象,而attachEvent()的this是window

    移除事件:当我们只想让事件执行一次的时候,就要移除事件
    var btn = my$('btn');
    
    对于btn.onclick = function () {}移除事件
    btn.onclick = function () {
        alert('我是点击事件');
        //移除事件
        this.onclick = null;
    }
    ------------------------------------------------------------
    对于btn.addEventListener()移除事件
    注意:如果要移除事件在这里就不能使用匿名函数了
    function btnClick() {
        alert('我是事件');  
        //移除事件
        this.removeEventListener('click', btnClick);
    }
    btn.addEventListener('click', btnClick);
    ---------------------------------------------------
    //移除事件的兼容性
    function removeEventListener(element, eventName, fn) {
        if(element.removeEventListener) {
            // 如果支持该方法则执行这里
            element.removeEventListener(eventName, fn);
        }else if(element.detachEvent) {
            element.detachEvent("on" + eventName, fn);
        }else {
            element['on' + eventName] = null;
        }
    }
    
    事件的三个阶段

    事件的三个阶段(每次事件发生这三个阶段都有,但是捕获阶段和冒泡阶段我们只能使用一个)
    1、捕获阶段
    2、目标阶段
    3、冒泡阶段

    当鼠标点击所看到的的按钮时,其实发生了一系列的事件传递,可以想象一下
    button实际上是被body“包裹”起来的,body是被html“包裹”起来的,html是被document“包裹”起来的,document是被window“包裹”起来的
    所以,在你的鼠标点下去的时候,最先获得这个点击的是最外面的window,然后经过一系列传递才会传到最后的目标button,当传到button的时候,这个事件又会像水底的泡泡一样慢慢往外层穿出,直到window结束。
    综上,一个事件的传递过程包含三个阶段,分别称为:
    捕获阶段,目标阶段,冒泡阶段

    <body>
        <div id="box1">
            <div id="box2">
                <div id="box3"></div>
            </div>
        </div>
        <script type="text/javascript" src="common.js"></script>
        <script type="text/javascript">
            var box1 = my$('box1');
            var box2 = my$('box2');
            var box3 = my$('box3');
            var arrays = [box1, box2, box3];
    
            我们现在为这三个div注册点击事件   
            1、使用onclick方式
            for(var i=0; i<arrays.length; i++) {
                console.log(arrays[i]);
                arrays[i].onclick = function () {
                    alert(this.id); 
                }
            }
            当点击box1的时候,会先弹出box3,再弹box2,最后box1 这个属于冒泡阶段
    -----------------------------------------------------------------------
            2、使用attachEvent()来注册事件(IE6-IE10支持)
            for(var i=0; i<arrays.length; i++) {
                arrays[i].attachEvent('onclick', funtion () {
                    alert(this.id);
                });
            }
            当点击box1的时候,会先弹出box3,再弹box2,最后box1 这个属于冒泡阶段
    
    -------------------------------------------------------------------
            3、使用addEventListener();之前我们只写了两个参数,他可以收三个参数
            第三个参数是布尔值(true代表事件捕获,false事件冒泡)
            for(var i=0; i<arrays.length; i++) {
                arrays[i].addEventListener('click', function () {
                    alert(this.id);
                }, true);
            }
            为true时,当点击box1的时候,会先弹出box1,再弹box2,最后box3 这个属于捕获阶段
            为false时,当点击box1的时候,会先弹出box3,再弹box2,最后box1 这个属于冒泡阶段
    
    综上所得,只有addEventListener才能选择是捕获阶段还是冒泡阶段,onclick和attachEvent都是事件冒泡
    
    ---------------------------------------------------------------------------
            阻止冒泡:通过事件对象来阻止冒泡
            stopPropagation这个是标准的DOM方法,老版本的IE不兼容
            老版本的IE用cancelBubble = true;
    
              for(var i=0; i<arrays.length; i++) {
                  console.log(arrays[i]);
                  //注册点击事件
                  arrays[i].onclick = function (e) {
                      alert(this.id); 
                      e.stopPropagation();
                      //e.cancelBubble = true;//老版本的IE
                  }
               }
    

    相关文章

      网友评论

          本文标题:对事件的详解

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