2012-01-09 10 views
38

आप jQuery के साथ चेतन करने के लिए एक वर्ग या तत्वों का संग्रह चुनते हैं:

$('.myElems').animate({....}); 

और फिर भी कॉलबैक फ़ंक्शन का उपयोग, आप किसी के साथ समाप्त असीमित animate() कॉल के बहुत सारे।

var i=1; 
$('.myElems').animate({width:'200px'}, 200, function(){ 
    //do something else 
    $('#someOtherElem').animate({opacity:'1'}, 300, function(){   
     if (i>1) console.log('the '+i+'-th waste of resources just finished wasting your resources'); 
     i++; 
    }); 
}); 

बेशक यह सिर्फ बुरा कोड और/या डिजाइन है - लेकिन वहाँ कुछ मैं दोनों कॉलबैक का उपयोग कर उनमें से केवल एक के साथ कई animate() कॉल होने से बचा जाता है कि क्या कर सकते हैं, और क्रियान्वित करने अनावश्यक कॉलबैक का भार होने और मेरे कोड/अपेक्षित व्यवहार के साथ खराब?

आदर्श रूप से मैं केवल एक 'डिस्पोजेबल' कॉलबैक को कोड करने में सक्षम हूं जो केवल एक बार चलाएगा - अन्यथा शायद यह जांचने का एक प्रभावी तरीका है कि jQuery द्वारा कुछ एनिमेटेड किया जा रहा है या नहीं?

उदाहरण: http://jsfiddle.net/uzSE6/ (चेतावनी - यह चेतावनी बक्से का भार दिखाएगा)।

+0

या तो फ़ाइल स्कोप पर या कहीं भी 'एनिमेट()' द्वारा पहुंचा जा सकता है। '$ (" # someOtherElem ') से पहले इसे जांचें। एनिमेट()' कॉल करें और इसे अपने शरीर में सेट करें ताकि '$ (" # someOtherElem ')। एनिमेट() 'अगली बार नहीं बुलाया जाएगा। – fardjad

उत्तर

99

आप की तरह when इस्तेमाल कर सकते हैं:

$.when($('.myElems').animate({width: 200}, 200)).then(function() { 
    console.log('foo'); 
}); 

http://jsfiddle.net/tyqZq/

वैकल्पिक ते संस्करण:

$('.myElems').animate({width: 200}, 200).promise().done(function() { 
    console.log('foo'); 
}); 
+7

मुझे यह पसंद है। मुझे यह बहुत पसंद है। मुझे इन कार्यों के बारे में पता नहीं था, इससे बहुत मदद मिली :) – jammypeach

+5

+1 मैंने इसे '$ (' html, body ') के लिए काफी उपयोगी पाया। एनिमेट (...) ' – Alvaro

2

आप दूसरी + कॉलबैक ब्लॉक करने के लिए एक चर बना सकते हैं ...

var i=1; 
$('.myElems').animate({width:'200px'}, 200, function(){ 
    //do something else 
    $('#someOtherElem').animate({opacity:'1'}, 300, function(){   
     if (i>1) return; 
     else 
     { 
      console.log('the '+i+'-th waste of resources just finished wasting your resources'); 
      i++; 
     } 
    }); 
}); 

यह केवल बाद के हर कॉलबैक के रूप में एक बार सक्रिय होगा रद्द हो जाएगी :)

+3

मैं 'i' की तुलना में एक अलग चर नाम का उपयोग करने का सुझाव दूंगा, जो सामान्य है और गलती से ओवरराइट होने की संभावना है, और स्पष्टता के लिए इसे 'सत्य' या 'गलत' पर सेट करना है। – Blazemonger

+1

^निश्चित रूप से, लेकिन मैंने उपयोग किया क्योंकि यह पहले से ही उदाहरण कोड में उपलब्ध था, मैंने इसे थोड़ा समायोजित किया। स्पष्टता के स्टैंडपॉइंट्स से 'कॉलबैकडोन' जैसे कुछ बुलियन मूल्यों पर सेट किया जाएगा और अधिक समझदारी होगी। – bardiir

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