我有一些执行以下操作的跟踪代码,并且绑定到所有<a>
代码上的点击事件(setTimeout符合Google网站上的建议,这是在卸载事件之前允许跟踪事件触发所必需的,我想):
$.fn.trackClick = function (e) {
// track the click
try {
_gaq.push(['_trackEvent', 'clicked-link', this.parents('[id]:first').get(0).id, (this.text() || this.children('img:first').attr('alt'))]);
} catch (err) {}
//only reload links with no bound events
if (!this.data('events') && !this.get(0).onclick && !e.isDefaultPrevented()) {
// wait a moment for the tracking to process, then follow the link
setTimeout('document.location = "' + $(this).attr('href') + '"', 200);
}
}
问题是,我们网站上有数百个链接,其中一些实际上没有重新加载任何东西(例如对话框关闭按钮),所以我需要setTimeout只在没有时才运行JS事件绑定到元素(或DOM树)。我想出了上面的if语句,我认为它可以解释任何和所有可能的绑定事件(代码库跨越了几年,所以那里可能存在各种愚蠢)。有没有其他人有更好的方法来做到这一点,或者我错过了一些可能的事件检查?
更新:这可能是关键,我应该早些提到它。上面的函数是以委托方式调用的,因此父div中的事件实际上是先触发的(因此我需要检测它们)。
jQuery(document).delegate('a', 'click', function(e){
e.preventDefault();
$(this).trackClick();
});