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;
  }
};
 

 

posted @   君临天下之徐少  阅读(1568)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示