在JavaScript中掌握事件监听

7
上周,我们经过一周左右的摸索和测试,在大量网站上发布了 Omniture 的分析代码。在几乎所有的网站模板上,它都可以正常工作。但是,在一些零散、不可预测的情况下,会出现严重的浏览器崩溃问题,这可能会让一些用户流失。
我们目前无法看到崩溃模板之间的关系,尽管有许多方法进行故障排除,但让我们困惑的是与事件监听器相关的问题。当这些模板上的任何锚点被点击时,网站就会崩溃。尽管我们通过 Firebug 检查了 HTML 的属性,没有发现任何明显的循环或问题会导致这种情况。(在我们进行故障排除时,您可以在此处自行体验:here [警告!单击页面中的任何链接都会导致浏览器崩溃!]) 如何判断对象是否具有监听器?如何确定事件触发时将触发什么内容? 顺便说一句,我很想设置断点,但由于 Omniture 可怜的混淆代码和反复的浏览器崩溃,我想更加深入地研究如何解决这个问题。
5个回答

4
我在该页面上使用firebug进行了“检查元素”,在DOM选项卡中发现有一个onclick函数(匿名),还有一个名为“s_onclick_0”的其他函数。
我通过在firebug中设置观察器来进一步了解。
alert(document.links[0].onclick)

我希望你能帮我翻译一下,这段文字与IT技术有关。需要翻译的内容是如何在点击链接时触发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;
}

也许以同样的方式,您可以看到在所有混淆之后它实际上正在运行什么。

1
另外:天哪!我的眼睛!代码混淆太糟糕了。 - Victor
我觉得我应该补充一下- Omniture 正在向页面上的每个链接添加一个匿名函数-正如J5(间接地)指出的那样,这个匿名函数是基于你的s_code(我推断出来的,因为我也遇到了同样的问题,正在使用Dojo和Omniture)。 - keif

1

DOM并没有提供任何方法来检测与节点相关的事件监听器集合。

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

最近在W3的WebAPI小组中进行了讨论,讨论是否要添加此功能。专家们似乎对此持反对态度。我分享他们的观点。


0

关于页面分析工具实现者的一些建议:

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

  • 不要在处理程序中执行计算密集型代码(以及任何IO操作),而是使用延迟调用来推迟执行

如果遵循这两个简单的规则,我相信您的浏览器将能够幸免于难。


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

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。

我个人没有链接跟踪配置方面的经验,否则我会给您更详细的配置说明 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接