7

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

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

我们目前无法看到崩溃模板之间的关系,虽然有很多方法可以解决问题,但让我们感到困惑的是与事件侦听器有关。

单击这些模板上的任何锚点时,站点会崩溃。没有任何内联 JS,并且当我们通过 HTML 的属性触发时,我们找不到会导致这种情况的可辨别的循环或问题。(当我们进行故障排除时,您可以在此处亲自体验[警告!单击页面中的任何链接将导致您的浏览器崩溃!])

你如何确定一个对象是否有监听器?您如何确定触发事件时会触发什么?

仅供参考,我很想设置断点,但是 在 Omnitures 悲惨地混淆代码和反复浏览器崩溃之间,我想更彻底地研究如何解决这个问题。

4

5 回答 5

4

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

也许以同样的方式,您可以在所有这些混淆之后看到它真正运行的内容。

于 2008-10-06T16:51:05.697 回答
1

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

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

最近在 W3 的 WebAPI 小组上有一个关于是否添加此功能的讨论。专家似乎反对这一点。我同意他们的论点。

于 2008-10-06T16:34:31.797 回答
0

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

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

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

如果考虑到这两个简单的规则,我敢打赌你的浏览器会存活下来

于 2008-10-06T16:43:12.543 回答
0

在回家的路上,我找到了一个解决方案,该解决方案允许对使用 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);
  }
})();
于 2008-10-06T17:44:28.257 回答
0

我对 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)。

我个人没有链接跟踪配置的经验,或者我会给你更多关于如何配置它的细节:)

于 2008-10-07T04:29:27.703 回答