事件绑定的两种形式

    xiaoxiao2021-03-26  29

          在面试中,有的时候我们想竭力的表达自己的想法,往往没有听清题目 就开始回答,所以给出的答案往往都是答非所问。面试时一定要听清面试官的题目,这样才可以在面试中做到游刃有余。而回答题目一般有两层意思:普通答案,期望答案。期望答案就是加分项,这 才是面试官真正提问这个问题的本意。比如:一般的 IE 事件绑定不 w3c 事件绑定有什么区 别?能说得上 attachEvent,addEventLisenter 的是普通答案,然后在继续 attachEvent 里 边的 this 指向会有问题,addEventLisenter 还有第三个参数,还有冒泡绑定等等用法之类 的。 所以由此得出的结论是不管我们的水平能力是多少,一定要听清题目,尽自己最大的努 力言简意赅的回答问题,而是要抓住要点。

    事件绑定有两种形式:

      一、给一个对象绑定一个事件处理函数的第一种形式如下:    

    obj.onclick = fn1; function fn1(){       alert(1);       alert(this); } function fn2(){     alert(2);     alert(this); }

      这种方式有个缺点:多个事件处理函数时会相互覆盖,比如:

    document.onclick = fn1; document.onclick = fn2;  //会覆盖前面绑定的fn1

    二、给一个对象绑定一个事件处理函数的第二种形式如下:

        在IE下用attachEvent,标准浏览器下用addEventListener。两者之间的区别如下:

    ① ie: obj.attachEvent(事件名称,事件函数)

    1.没有捕获 2.事件名称有on 3.多个事件函数执行的顺序:标准ie下正序 非标准ie下倒序 4.this指向window

    ② 标准:obj.addEventListener(事件名称,事件函数,是否捕获);

    1.有捕获 2.事件名称没有on 3.多个事件执行的顺序是正序 4.this指向触发该事件的对象(在下面的例子中指的是document)

    示例如下:

    document.attachEvent('onclick',fn1);

    document.attachEvent('onclick',fn2);

    此时,attachEvent的this指向window,可利用call来修正attachEvent的this指向问题,由window对象变为document对象,具体代码如下: document.attachEvent('onclick',function(){     fn1.call(document); })

    document.attachEvent('onclick',function(){     fn2.call(document); })

    document.addEventListener("click",fn1,false); document.addEventListener("click",fn2,false);

     addEventListener的第三个参数表示是否捕获:默认是false。false代表冒泡, true代表捕获

    通过如下代码,还可以发现这种方式的特点是:可以给一个对象的同一个事件绑定多个不同的函数,多个事件处理函数时不会相互覆盖。

    最后,为了兼容不同的浏览器,封装bind绑定函数,同时解决attachEvent的this指向问题,具体代码如下:

    function bind(obj,evname,fn){

       if(obj.addEventListener){

               obj.addEventListener(evname,fn,false);     }else{           obj.attachEvent('on' + evname,function(){                 fn.call(obj);           });     } }

    bind(document,'click',fn1); bind(document,'click',fn2);

                    

    转载请注明原文地址: https://ju.6miu.com/read-662283.html

    最新回复(0)