• FireFox和Safari兼容event.path


    问题的出现: 由于在添加埋点的时候,给document绑定一个事件,然后循环e.path找出元素下的attribute的ilog,然后发送埋点。

    在项目开发中遇到需要获取触发事件元素冒泡过程的所有元素,在Chrome中可以通过event.path获取。

    element.onClick(event) {
      const ev = window.event || event;
      const path = ev.path;
    }
    

    该属性在Chrome和Opera浏览器下没问题,但是在Firefox和Safari中发现event并没有path属性。
    进过查找资料发现,在浏览器新的标准里定义了composedPath可以获取

    element.onClick(event) {
      const ev = window.event || event;
      const path = event.path || (event.composedPath && event.composedPath());
      console.log(path)  //[button#btn, div, body, html, document, Window]
    }


    但是以上ios只支持10以上版本,为了兼容ios9.X请看下面完整例子
    * 获取事件冒泡路径,兼容ie11,edge,chrome,firefox,safari * @param evt * @returns {*} */

    最总完整事件:
    var ATTR_NAME = 'data-ilog';
    var ATTR_BINDED = 'ilogbinded';
    var location = window.location;

    var getInnerText = function getInnerText(element) {
      return typeof element.textContent === 'string' ? element.textContent : element.innerText;
    };
     

    var eventPath = function eventPath(evt) {
      const path = (evt.composedPath && evt.composedPath()) || evt.path,
      target = evt.target;

      if (path != null) {
        return (path.indexOf(window) < 0) ? path.concat(window) : path;
      }

      if (target === window) {
        return [window];
      }

      function getParents(node, memo) {
        memo = memo || [];
        const parentNode = node.parentNode;

        if (!parentNode) {
          return memo;
        } else {
          return getParents(parentNode, memo.concat(parentNode));
        }
      }

      return [target].concat(getParents(target), window);
    }

     
    var bind = function bind(e) {
      var target;
      var path = eventPath(e);
      if(path && path.length>0){
      for (var i = 0; i < path.length; i++) {
        if (path[i].dataset && path[i].dataset.ilog) {
          target = path[i];
        }
      }
    }
     
    if (target) {
      var asm = target.getAttribute(ATTR_NAME);
      var isBinded = target.getAttribute(ATTR_BINDED);
      if (asm && isBinded === null) {
        var href = encodeURIComponent(location.href);
        var txt = getInnerText(target) + '';
        txt = txt.trim();
        // 发送埋点({ href: href, txt: txt, asm: asm })
      }
      return false;
      }
    };
     
  • 相关阅读:
    Scala学习(八)---Scala继承
    Scala学习(九)---文件和正则表达式
    Scala学习(六)---Scala对象
    jemter----命令行模式(cmd)导出测试报告
    js数据类型
    定期任务,如每月清理(SpringBoot Mybatis-Plus)
    定时执行任务(SpringBoot Mybatis-Plus)
    图片服务映射(SpringBoot mybatis-plus)
    图片压缩上传(Springboot mybatis-plus)
    java生成pdf
  • 原文地址:https://www.cnblogs.com/xuLessReigns/p/11276225.html
Copyright © 2020-2023  润新知