2012-01-26 35 views
2

比方說,我有一個名爲「bar」元素#foo對事件執行功能。jQuery的或純JS:後事件偵聽器返回

有沒有一種方法,我可以使用jQuery推遲對象強制功能的bar事件偵聽器(S)已/已執行後立即執行(返回),不論是否有bar聽衆取消事件?

或者,也許我也不需要jQuery的這個?

編輯:「那bar事件後,」只是爲了澄清,引發從bar處理程序中的另一個事件或功能是不是我要找的—的bar處理程序還沒有恢復,所以這不是這個問題似乎很奇怪因爲我試圖解決一個非常具體的問題/漏洞在IE中需要8

像這樣的事情沒有意義:

$('#foo').afterEvent('bar').then(function() { 
    // do something 
}); 
+1

我覺得本身就是你的問題很有趣,但如果你的基本目標是解決一個IE8問題,您應該發表一個關於這個問題的問題,因爲有可能是對付它的一些其他的方式。 – nnnnnn

+0

已經有。實際上只有一個答案有效,但它依賴於setTimeout()並且不是確定性的。 – user979672

+0

@ user979672 - 你能提供IE8有關問題的詳細信息? – ShankarSangoli

回答

0

酒吧內只要運行的另一種方法事件

$('#foo').bind('bar', function() { 
    // do bar stuff 
    // run another method 
    baz(); 
    // or trigger any other listening events 
    $('#bin').trigger('otherEvent'); 
}); 
+0

但是,當同一個事件有多個綁定時,它們按照它們綁定的順序被調用,所以如果其中一個調用'event.stopImmediatePropagation()',那麼後面的處理程序根本就不會被調用。這不是問題的問題嗎? – nnnnnn

+0

是的。如果這是一個問題,這個問題很難解釋。在我看來,他想要運行一個事件並調用antoher函數 – Trevor

+0

正確,nnnnnn,事件需要觸發事件是否被任何監聽者取消。這聽起來很奇怪,很冒險,但我試圖解決IE 8中的一個bug。 – user979672

0

什麼你想要做的就是所謂的多播的代表,在這裏你將多個,獨立,處理同一事件。它可以在JavaScript寫成如下:

function multicast(){ 
if (arguments == null || arguments.length == 0) return function(){ }; 

var fns = [], j = 0; 
for (var i = 0; i < arguments.length; i++){ 
if (typeof(arguments[i]) == "function") 
fns[j++] = arguments[i]; 
} 

return function(){ 
for (var i = 0; i < fns.length; i++) 
fns[i](); 
}; 
} 

然後調用爲:(其中foo和酒吧都是功能)

window.onload = multicast(window.onload, foo, bar); 

沒有jQuery是必要的,這是嚴格的JavaScript。您會注意到每個函數都將按順序執行,但與前一個函數調用的返回值(如果有)無關。

您將在Delphic Sage發現這是一個更完整的描述。我還要指出的是,鏈接文章的作者約翰學分Resig的教程Learning Advanced JavaScript

[編輯] 我想有東西從你的問題遺漏。我讀了這個問題的方法應該做你所要求的:(使用功能多播()以上)

$(#'foo').bind('bar',multicast(firstFunction, secondFunction); 

現在,當「酒吧」發生了firstFunction將執行secondFunction緊隨其後,並且將這樣做,無論是否對了firstFunction「取消事件」

+0

這與其他解決方案存在相同的問題。 'bar'在'window.onload'的處理函數/監聽器中執行*,因爲'window.onload'是因爲在處理函數返回之前執行'window.onload','foo',然後'bar'的函數。 – user979672