掌握JavaScript中的事件监听

时间:2008-10-06 15:56:18

标签: javascript firebug event-listener

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

在我们几乎所有的网站模板上,它都运行得很好。在一些分散的,不可预测的情况下,瘫痪,浏览器崩溃的体验 可能会拒绝某些用户。

我们目前无法看到崩溃模板之间的关系,而且 有很多方法可以解决问题,那么混淆我们的方法与事件监听器有关。

单击这些模板上的任何锚点时,网站会崩溃。没有任何内联JS,虽然我们通过HTML的属性抨击我们的方式,但我们找不到可能导致此问题的可辨别的循环或问题。 (在我们进行问题排查时,您可以亲自体验一下here [警告!点击页面中的任何链接都会导致浏览器崩溃!]

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

  

仅供参考,我想设置断点,但是   Omnitures之间的错误混淆代码和重复的浏览器   崩溃,我想研究更多   我将如何处理这个问题。

5 个答案:

答案 0 :(得分:4)

我在该页面的链接上使用firebug做了一个“inspect元素”,在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;
}

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

向页面分析实施者提出的一系列建议:

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

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

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

答案 3 :(得分: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);
  }
})();

答案 4 :(得分: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)。

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