1

我们正试图让我们的网站摆脱通常有 100 多个元素上的内联 onclick="" 处理程序。其中大部分是通过 onclick 属性附加的 Omniture 点击跟踪功能。

由于它们都是相同的代码,我想使用 jQuery 的 .live() 函数简单地将单个处理程序绑定到文档。然后我们将更新我们想要跟踪的链接/按钮/元素,使其具有唯一的标记,例如 class="trackable"。我们让处理程序注册如下(考虑这个伪代码):

$('.trackable').live('click', function(e) { 
  trackClick();
};

显然我们需要一些参数,我们会从事件源对象中推断出这些参数,可能是通过数据属性或其他方式。

我关心的主要是可靠性。根据我的阅读,live() 处理程序不会被中断——例如,事件应该在浏览器卸载页面之前冒泡并被处理。不过,我不确定。我对浏览器的兼容性也有一些担忧。

有人对 live() 事件绑定和 Omniture(或 Google Analytics)有任何经验吗?

4

2 回答 2

1

这是我的解决方案。我觉得它很粗糙,但我认为它有效。

// attach omniture tracking to links within search results
jQuery('.app1 .app1-searchresults').on('click', '.app1-entry a', function(event) {
    var jLink = jQuery(event.target);

    s_gi(s_account).tl(true, 'o', 'App1: {instance}: {link}'.supplant({
        'instance': jQuery('.app1 .app1-header').text(),
        'link': jLink.text()
    }));

    setTimeout(function() { window.location = jLink.attr('href'); }, 500);

    event.preventDefault();
    return false;
});

重要的部分不是 jQuery 部分——大概,你有一些方法来识别你有兴趣跟踪的链接,并实现一个委托事件处理程序——而是最后 3 个语句。

  • setTimeout

Adobe 的 Ben Gaines 的这篇文章指出(在“对链接以外的东西使用链接跟踪”部分中)s.tl() 在导航之前引入了 500 毫秒的延迟。这是为了确保异步跟踪调用在页面卸载之前有时间执行。我见过 Chrome “取消”与导航操作同时进行的 HTTP 调用;Fiddler 甚至会从它的请求列表中删除流量。我没有使用 WireShark 的经验,所以我决定谨慎行事并引入相同的延迟。

  • event.preventDefault()
  • return false

这可以防止浏览器在用户单击链接时做出正常反应并立即导航离开。

这里的粗鲁似乎是 setTimeout。我对使用计时器而不是事件驱动的东西有点不舒服,因为它需要尽可能多或尽可能少的时间来确保进行跟踪调用。但是,如果没有 Omniture 的官方支持,允许显式延续或自定义跟踪捕获事件,这可能是最安全的事情。

我希望这有帮助。

于 2013-08-26T21:29:47.743 回答
-1

唯一可以阻止 live() 的是你。如果您在某个时候使用 Jquery 的 event.stopPropagation() 或浏览器特定方法之一中断传播,那么可以肯定,它会死掉。但是,否则你会没事的。

于 2011-08-25T05:08:19.353 回答