Проверка JavaScript на наличие связанных или всплывающих событий на делегированных ссылках - PullRequest
1 голос
/ 21 декабря 2011

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