2011-06-08 34 views
2

我想允许某些元素(即<a><form>)的默认事件行为,直到我可以确定已处理Google Analytics队列中的项目。在事件被停止或阻止后,DOM事件可以被允许为其默认行为吗?

我见过涉及添加事件监听器停止传递事件(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再现什么浏览器可以做如果它被允许处理我已经停止的click事件(使用return false);这似乎没有必要。如果special-a-elementtarget = "_blank"?聆听者不会在新窗口中打开链接,而是在当前链接中(因为document.location)。

所以我想允许默认行为不停止它然后重新执行它。有什么建议么?

+0

改变了措辞,因为我希望能允许的默认事件处理行为的发生_once_我额外的代码已经完成; _delaying_的默认行为并不完全是我所追求的。 – lucasrizoli 2011-06-10 17:21:55

回答

-1

你可以实现一个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); 
} 

或者,如果你并不需要的时间延迟,只是不喜欢它处于睡眠() - while (!/* check if GA is ready */);中的结束你想延迟的事件。

+0

是的,我有一个循环等待遗传算法的好处(即,将'function(){allowEvent = true;}'推入'_gaq',然后'while(!allowEvent);''return true;'in事件处理程序,但这看起来不正确,你知道吗? – lucasrizoli 2011-06-09 17:57:56

+0

@lucasrizoli:我同意你的观点,在这个例子中也不觉得正确使用它,但它可以完成工作 – 2011-06-09 18:08:09

0

你不能这样做......

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

    // cancel the event 
    return false; 
}) 
+0

我可以,但添加一个超时并不是我真正想要的,我希望**一旦其他代码运行后允许默认行为**,而不是_delay_默认行为一段时间,其中一些其他代码可能会运行,挖掘? – lucasrizoli 2011-06-10 17:20:54

相关问题