经过上周左右的修补和测试,上周我们将 Omniture 的分析代码发布到大量网站上。

在我们几乎所有的网站模板上,它都工作得很好。在一些分散的、不可预测的情况下,有一个 造成浏览器崩溃的严重体验可能 拒绝一些用户。

我们目前无法看到崩溃模板之间的关系,而在那里 解决问题的方法有很多,但令我们困惑的一种与事件侦听器有关。

单击这些模板上的任何锚点时,网站就会崩溃。没有任何内联 JS,虽然我们通过 HTML 的属性进行了 firebug 处理,但我们找不到可识别的循环或会导致此问题的问题。(在我们排除故障的同时,您可以亲自体验一下 这里 [警告!单击页面中的任何链接都会导致您的浏览器崩溃!])

如何确定一个对象是否有侦听器?如何确定事件触发时将触发什么?

仅供参考,我很想设置断点,但是 在全净值之间令人痛苦的混淆代码和重复的浏览器崩溃之间, ,我想更彻底地研究如何解决这个问题。

有帮助吗?

解决方案

我做了一个“检查元素”。在该页面中带有firebug的链接上,在DOM选项卡中,它表示有一个onclick函数(匿名),还有一些其他函数叫做“s_onclick_0”。

我哄骗萤火虫放置像

这样的手表
alert(document.links[0].onclick)

提醒我omniture(我猜)附加到链接上的onclick函数:

function anonymous(e) {
  var s = s_c_il[0], b = s.eh(this, "onclick");
  s.lnk = s.co(this);
  s.t();
  s.lnk = 0;
  if (b) {
     return this[b](e);
  }
  return true;
}

也许以同样的方式,你可以看到在所有混淆之后它真正运行的是什么。

其他提示

DOM没有提供任何方法来通过与节点关联的事件侦听器集合进行内省。

唯一可以识别侦听器的情况是通过在元素上设置属性或属性来添加侦听器 - 检查onxxx属性或属性。

最近在W3的WebAPI小组上就是否添加此功能进行了讨论。专家似乎反对这一点。我分享他们的论点。

给页面分析实施者的一组建议:

  • 仅使用文档级事件捕获,这在几乎所有情况下(除了更改/提交事件)就足够了

  • 不要在处理程序中执行计算密集型代码(以及任何 IO 操作),而是通过超时推迟执行

如果考虑到这两个简单的规则,我敢打赌你的浏览器将生存

我对Omniture有一些经验并且查看了你的s_code.js,你在“链接跟踪”中有几件事情正在进行中。区域,例如:


/* Link Tracking Config */
s.trackDownloadLinks=true
s.trackExternalLinks=true
s.trackInlineStats=true
s.linkDownloadFileTypes="exe,zip,wav,mp3,mov,mpg,avi,wmv,pdf,doc,docx,xls,xlsx,ppt,pptx"
s.linkInternalFilters="javascript:,gatehousemedia.com"
s.linkLeaveQueryString=false
s.linkTrackVars="None"
s.linkTrackEvents="None"

我会咨询Omniture的人员并确认您的链接跟踪配置已正确设置。

具体来说,这个模板和里面的链接似乎属于morningsun.net,但morningsun.net不在s.linkInternalFilters设置中。如果您对多个域使用相同的s_code.js文件,则可以使用javascript为此类设置配置值(例如,基于document.location.hostname)。

我个人没有链接跟踪配置的经验,或者我会为您提供有关如何配置它的更多详细信息:)

回家旅行时,我找到了一个解决方案,允许在AddEventListener添加的元素上内省事件处理程序。在包含分析代码之前运行代码。如果有效,代码未经验证,但我想这个想法很清楚。它在IE中不起作用,但是你也可以在那里应用类似的技术(重写API成员)。

(function(){
  var fAddEventListener = HTMLElement.prototype.addEventListener;
  HTMLElement.prototype.addEventListener = function() {
   if (!this._listeners)
      this._listeners = [];
   this._listeners.push(arguments);
   fAddEventListener.apply(this, arguments);
  }
})();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top