2011-08-24 73 views
11

我似乎至少觀察到一個情況,即如果執行過程中出現錯誤,傳遞給jQuery效果函數的回調函數將重複執行。jQuery回調顯然重複失敗?

例如,見this JS Fiddle,具有下面的代碼:

$('#awesome').fadeOut(400,function() { 
    log('fading out...'); 
    dieInAFire(); 
}); 

log附加任何真實傳遞給它一個div ...但dieInAFire不存在。然而,只是停止執行,然而,匿名函數似乎一遍又一遍地被調用,正如越來越多的出現在日誌div中的「淡出......」所證明的那樣。

這是預期的行爲?如果是這樣,爲什麼?

+0

驚人的發現取代它... :-)對我來說這不是預期的。 – HBublitz

+1

它看起來像一個jQuery的bug。 – Emil

+0

非常奇怪,看起來它與動畫有關。 AJAX回調沒有這個問題,如果沒有動畫,這個回調也沒問題。如果元素已經具有樣式'display:none;'這個回調被調用一次,那麼IE。同樣的問題也出現在fadeIn()中 – Paulpro

回答

1

我剛剛提交了關於patrick dw發佈的錯誤的評論。

更改行:

options.complete.call(elem); 

要:

setTimeout(function(){ 
    options.complete.call(elem); 
}, 0); 

導致回調異步執行,如果如果它拋出任何錯誤,將不再停止執行。國際海事組織它比使用try catch好,因爲它不會抑制異常。

如果你想編輯縮小的版本,並使用了最新的jQuery,你可以搜索e.complete.call(d)setTimeout(function(){e.complete.call(d)},0)