• attachEvent和addEventListener区别总结


    1.attachEvent与addEventListener的区别

    • 支持的浏览器不同。attachEvent在IE9以下的版本中受到支持。其它的都支持addEventListener
    • 参数不同。addEventListener第三个参数可以指定是否捕获,而attachEvent不支持捕获。
    • 事件名不同。attachEvent第一个参数事件名前要加on,比如el.attachEvent('onclick', handleClick)。
    • this不同。本文的将重点解释

    2.attachEvent方式的事件绑定

    attachEventthis总是Window。例如:

    el.attachEvent('onclick', function(){
        alert(this);
    });

    执行后会弹出对话框:[object Window]

    3.addEventListener方式的事件绑定

    addEventListenerthis总是当前正在处理事件的那个DOM对象。 DOM Level 2 Event Model中提到,事件处理包括捕获阶段、目标阶段和冒泡阶段 。如下图:

    事件当前正在流过哪个元素,this便指向哪个元素。比如对于两级的DOM:

    <div id="l1">
      <div id="l2"></div>
    </div>
    <script type="text/javascript">
      var l1 = document.getElementById('l1'),
          l2 = document.getElementById('l2');
    
      l1.addEventListener('click', function () {
        console.log('l1 capture', this);
      }, true);
      l1.addEventListener('click', function () {
        console.log('l1 bubbling', this);
      });
      l2.addEventListener('click', function () {
        console.log('l2 target', this);
      });
    </script>

    点击div#l2后控制台输出为:

    l1 capture <div id=​"l1">​…​</div>​
    l2 target <div id=​"l2">​</div>​
    l1 bubbling <div id=​"l1">​…​</div>​

    4.纠正attachevent

    Event.addEvent = function(target,eventType,handle){
        target.attachEvent('on'+eventType,function(){
            handle.call(currentTarget,arguments);//改变this指向
        });
    }

    这里使用了currentTarget,我们再来顺着分析一下target与currentTarget。

    addEventListener的事件处理函数中this不一定指向事实上被点击的元素, 但事件处理函数的参数Event对象提供了targetcurrentTarget属性来区分这当前对象与目标对象。 我们可以把它们都全部输出:

    l1.addEventListener('click', function (e) {
      console.log('l1 capture', this, e.currentTarget, e.target);
    }, true);
    l2.addEventListener('click', function (e) {
      console.log('l2 target', this, e.currentTarget, e.target);
    });
    l2.addEventListener('click', function (e) {
      console.log('l2 target, invalid capture', this, e.currentTarget, e.target);
    }, true);

    结果是:

    l1 capture  <div id=​"l1">​…​</div>​  <div id=​"l1">​…​</div>​  <div id=​"l2">​</div>​
    l2 target   <div id=​"l2">​</div>​   <div id=​"l2">​</div>​   <div id=​"l2">​</div>​
    l1 bubbling <div id=​"l1">​…​</div>​  <div id=​"l1">​…​</div>​  <div id=​"l2">​</div>​

    可见currentTarget总是和this相同,而target指向事实上被点击的目标DOM对象。

    5.补充:onclick在HTML和脚本中this指向的区别

    脚本设置onclick方式的事件绑定

    在javascript中设置DOM对象的onclick属性,this总是指向被设置的DOM元素。例如:

    document
      .getElementById('l1')
      .onclick = function(){
        console.log(this);
      };

    点击div#l1后控制台输出为:

    <div id="l1">...</div>

    HTML中设置onclick方式的事件绑定

    在HTML中设置onclick属性相当于让Window来调用该处理函数,于是this总是Window。例如:

    <div onclick="clickHandler()"></div>
    <script>
    function clickHandler(){
        console.log(this);
    }
    </script>

    点击这个div后的控制台输出为:

    Window {top: Window, location: Location, document: document, window: Window, external: Object…}
  • 相关阅读:
    Web自动化测试项目搭建(一) 需求与设计
    Python
    Selenium(七):截图显示等待
    14、ABPZero系列教程之拼多多卖家工具 新建微信公众号模块
    13、ABPZero系列教程之拼多多卖家工具 微信公众号开发前的准备
    12、ABPZero系列教程之拼多多卖家工具 拼团提醒功能登录拼多多实现
    11、ABPZero系列教程之拼多多卖家工具 拼团提醒功能页面实现
    10、ABPZero系列教程之拼多多卖家工具 拼团提醒逻辑功能实现
    9、ABPZero系列教程之拼多多卖家工具 拼团提醒类库封装
    8、ABPZero系列教程之拼多多卖家工具 添加手机注册登录功能
  • 原文地址:https://www.cnblogs.com/shytong/p/5105536.html
Copyright © 2020-2023  润新知