Можно ли разрешить событию DOM поведение по умолчанию после того, как оно было остановлено или предотвращено? - PullRequest
2 голосов
/ 09 июня 2011

Я бы хотел разрешить поведение по умолчанию для определенных элементов (т. Е. <a> и <form>), пока я не смогу быть уверенным, что элементы в очереди Google Analytics были обработаны.

Я видел много методов, которые включают добавление прослушивателя событий, который останавливает переданное событие (event.stop() или event.stopPropagation() или return false) или предотвращает его поведение по умолчанию (event.preventDefault()).Затем для этого требуется, чтобы поведение было каким-то образом переписано, вместо того, чтобы просто передавать / активировать / освобождать исходное событие.

Например, для mootools я мог бы использовать следующий обработчик события на <a id="special-a-element"> для нажатия иобработать событие GA перед перенаправлением на целевой документ:

$('special-a-element').addEvent('click', function() {
    var url = this.get('href');
    _gaq.push(['_trackEvent', 'category', 'action']);
    _gaq.push(function() { document.location = url; });
    return false;
});

Здесь document.location воссоздает то, что браузер мог бы сделать, если бы ему было разрешено иметь дело с остановленным событием clickreturn false);это кажется ненужным.Что если у special-a-element было target = "_blank"?Слушатель не будет открывать ссылку в новом окне, но в текущем (из-за document.location).

Поэтому я хотел бы разрешить поведение по умолчанию, не останавливая его, а затем повторно реализоватьон .Есть предложения?

Ответы [ 2 ]

0 голосов
/ 10 июня 2011

Не могли бы вы сделать что-то вроде ...

$(...).addEvent(function(e) {
  setTimeout(function() {
    e.target.parentNode.dispatchEvent(e)
  }, 1000);

  // cancel the event
  return false;
})
0 голосов
/ 09 июня 2011

Вы можете реализовать функцию sleep и использовать ее так:

$(document).ready(function(){
    $("a").click(function(){
        // do other stuff here
        sleepUntilGAReady();
    });
});

function sleepUntilGAReady() {
    var GAReady = false;
    while (!GAReady) {
         sleep(500);        
         GAReady = /* check if it's done */;
    }
}

function sleep(miliseconds) {
    var start = new Date().getTime();
    while (new Date().getTime() - start < miliseconds); 
}

Или, если вам не нужна задержка, просто сделайте это, как в sleep () - while (!/* check if GA is ready */);в конце события вы хотите отложить.

...