У меня есть некоторый код отслеживания, который выполняет следующие действия и привязан к событию click для всех тегов <a>
(setTimeout соответствует рекомендациям на сайте Google, которые необходимы для того, чтобы событие отслеживания сработало до события unload. думаю):
$.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();
});