美文网首页
JS常见面试问题

JS常见面试问题

作者: iliuqiang | 来源:发表于2020-03-14 08:58 被阅读0次

    target与currentTarget区别

    target在事件流的目标阶段;currentTarget在事件流的捕获,目标及冒泡阶段。只有当事件流处在目标阶段的时候,两个的指向才是一样的, 而当处于捕获和冒泡阶段的时候,target指向被单击的对象而currentTarget指向当前事件活动的对象(一般为父级)。

    <div id="outer" style="background:#099;padding:20px 0;">  
        click outer  
        <p id="inner" style="background:#9C0;">click inner</p>   
    </div>
    
    <script type="text/javascript">
    function G(id) {
      return document.getElementById(id);
    }
    
    function addEvent(obj, ev, handler) {
      if (window.attachEvent) {
        obj.attachEvent("on" + ev, handler);
      } else if (window.addEventListener) {
        obj.addEventListener(ev, handler, false);
      }
    }
    
    function test(e) {
      alert("e.target.tagName : " + e.target.tagName +"\n e.currentTarget.tagName : " +e.currentTarget.tagName);
    }
    var outer = G("outer");
    var inner = G("inner");
    //addEvent(inner, "click", test);
    addEvent(outer, "click", test);
    </script>
    

    上面的示例中,当在outer上点击时,e.target与e.currentTarget是一样的,都是div;当在inner上点击时,e.target是p,而e.currentTarget则是div。

    addEventListener()及attachEvent()区别

    大家都知道事件的用法就是当某个事件(状况)被触发了之后就会去执行某个Function, 尤其是Javascript, 在当红AJAX的催化下, 了解Javascript的Event用法更加重要, 在这里就大概介绍一下Javascript的Event用法

    【IE中】:

    attachEvent函数语法:

    target.attachEvent(type, listener);

    target: 文档节点、document、window 或 XMLHttpRequest。
    type: 字符串,事件名称,含“on”,比如“onclick”、“onmouseover”、“onkeydown”等。
    listener :实现了 EventListener 接口或者是 JavaScript 中的函数。 例如:document.getElementById("txt").attachEvent("onclick",function(event){alert(event.keyCode);});

    【非IE中】:

    addEventListener函数语法:

    target.addEventListener(type, listener, useCapture);

    target: 文档节点、document、window 或 XMLHttpRequest。
    type: 字符串,事件名称,不含“on”,比如“click”、“mouseover”、“keydown”等。
    listener :实现了 EventListener 接口或者是 JavaScript 中的函数。
    useCapture :是否使用捕捉,一般用 false 。例如:document.getElementById("testText").addEventListener("keydown", function (event) { alert(event.keyCode); }, false);

    【使用场景】

    一般我们在JS中添加事件,是这样子的:

    obj.onclick=method

    这种绑定事件的方式,兼容主流浏览器,但如果一个元素上添加多次同一事件呢?

    obj.onclick=method1
    obj.onclick=method2
    obj.onclick=method3

    如果这样写,那么只有最后绑定的事件,这里是method3会被执行,这个时候我们就不能用onclick这样的写法了,
    主角改登场了,在IE中我们可以使用attachEvent方法:

    btn1Obj.attachEvent("onclick",method1);
    btn1Obj.attachEvent("onclick",method2);
    btn1Obj.attachEvent("onclick",method3);

    注意:使用格式是前面是事件类型,注意的是需要加on,比如onclick,onsubmit,onchange
    以上方法的执行顺序:

    method3->method2->method1

    可惜这个微软的私人方法,火狐和其他浏览器都不支持,幸运的是他们都支持W3C标准的addEventListener方法

    btn1Obj.addEventListener("click",method1,false);
    btn1Obj.addEventListener("click",method2,false);
    btn1Obj.addEventListener("click",method3,false);

    以上方法的执行顺序:

    method1->method2->method3

    相关文章

      网友评论

          本文标题:JS常见面试问题

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