2011-08-24 4 views
11

मुझे लगता है कि कम से कम एक मामला देख रहा है जहां एक jQuery प्रभाव फ़ंक्शन में पास किया गया कॉलबैक फ़ंक्शन बार-बार निष्पादित होगा यदि इसे निष्पादित करते समय कोई त्रुटि हो।jQuery कॉलबैक स्पष्ट रूप से विफलता पर दोहराना?

उदाहरण के लिए, this JS Fiddle देखते हैं, निम्नलिखित कोड की विशेषता:

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

log संलग्न कर देता है जो कुछ भी एक div करने के लिए इसे के लिए पारित किया है ... लेकिन dieInAFire मौजूद नहीं है। इसके बजाय निष्पादन को रोकना, हालांकि, अज्ञात फ़ंक्शन को ओवर-ओवर कहा जा रहा है, जैसा कि लॉग div में 'fading out ...' की उपस्थिति की बढ़ती संख्या से प्रमाणित है।

क्या यह अपेक्षित व्यवहार है? यदि हां, तो क्यों?

+0

अद्भुत खोजों के साथ यह जगह ले सकता है का उपयोग करते हैं ... :-) मेरे लिए यह बिल्कुल भी उम्मीद नहीं है। – HBublitz

+1

यह एक jQuery बग की तरह दिखता है। – Emil

+0

बहुत अजीब, ऐसा लगता है कि एनीमेशन के साथ कुछ करना है। AJAX कॉलबैक में यह समस्या नहीं है, और यदि कोई एनीमेशन नहीं है तो यह कॉलबैक ठीक है। आईई अगर तत्व में पहले से ही स्टाइल 'डिस्प्ले है: कोई नहीं;' कॉलबैक को बिल्कुल एक बार कहा जाता है। FadeIn() भी – Paulpro

उत्तर

4

यह एक ज्ञात बग है। See the report here.

+0

+1 Grrrr, वही उत्तर देने वाला था :) – Krule

+0

वाह, यह पुराना-आश भी है। –

+1

इसे अभी तय कर दिया गया है :) – Paulpro

1

मैंने अभी पैट पर पोस्ट की गई बग पर एक टिप्पणी सबमिट की है।

लाइन बदलने:

options.complete.call(elem); 

करने के लिए:

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

कारण एसिंक्रोनस रूप से निष्पादित करने के लिए कॉलबैक, और अगर यह नहीं रह गया निष्पादन बंद हो जाएगा अगर यह किसी भी त्रुटि फेंकता है। आईएमओ try catch का उपयोग करने से बेहतर है क्योंकि यह अपवाद को दबा नहीं देता है।

आप अपने minified संस्करण संपादित करना चाहते हैं, और आप नवीनतम jQuery, आप e.complete.call(d) के लिए खोज और setTimeout(function(){e.complete.call(d)},0)

संबंधित मुद्दे