2012-02-27 6 views
5

मैं कॉलबैक उपयोग नहीं कर सकते क्योंकि मैं इस (छद्म कोड) की तरह एक परिदृश्य है:jQuery में सिंक्रोनस एनिमेशन, कॉलबैक का उपयोग नहीं कर रहे हैं?

$('.box').on('click', function() { 
    $('.expanded-box').animate({ 
     // shrink it 
    }); 

    $(this).animate({ 
     // grow it 
     $(this).addClass('expanded-box'); 
    }); 
}); 

मैं नहीं expanded-box विकास एनीमेशन के लिए कॉलबैक के भीतर विस्तार एनीमेशन डाल सकते हैं, क्योंकि यह हमेशा ऐसा नहीं हो सकता है । लेकिन मुझे पिछली एनीमेशन तक इंतजार करने के लिए दूसरी एनीमेशन चाहिए। मैं यह कैसे कर सकता हूँ?

+0

आप "यह हमेशा ऐसा नहीं हो सकता है।" से क्या मतलब है? क्या आपका मतलब है कि 'एक्सपेन्डेड-बॉक्स' मौजूद नहीं हो सकता है? –

उत्तर

7

jQuery 1.6 के बाद से, आप promise() उपयोग कर सकते हैं एक Promise object प्राप्त करने के लिए कि किसी दिए गए तत्व पर सभी एनिमेशन पूर्ण होने पर हल हो जाएंगे। इसके अलावा, प्रलेखन कहता है:

कोई सक्रिय एनीमेशन वाले संग्रह पर .promise() का उपयोग हल किए गए वादे को देता है।

इसलिए, यह आपके उपयोग मामले पर अच्छी तरह से अनुकूल है, और आप लिख सकते हैं:

$('.box').on('click', function() { 
    var $this = $(this); 
    $('.expanded-box').animate({ 
     // shrink it 
    }).promise().done(function() { 
     $this.animate({ 
      // grow it 
     }).addClass('expanded-box'); 
    }); 
}); 
+0

कूल, 'वादा() 'के बारे में भी नहीं पता था - धन्यवाद! यह भी कई अलग-अलग तरीकों पर काम करता है। – CaptSaltyJack

+0

पहली एनीमेशन के पूर्ण कॉलबैक में दूसरा भाग डालने के लिए यह अलग कैसे है? – nnnnnn

+1

@nnnnn, अगर '$ (" विस्तारित-बॉक्स ") कुछ भी मेल नहीं खाता है, तो 'पूर्ण' कॉलबैक नहीं कहा जाएगा, क्योंकि इसे प्रत्येक मिलान किए गए तत्व के लिए एक बार कहा जाता है। दूसरी तरफ, 'वादा() 'एक खाली' वादा 'ऑब्जेक्ट देता है यदि एक खाली jQuery ऑब्जेक्ट पर बुलाया जाता है, इसलिए यह सुनिश्चित करना कि' पूर्ण()' को पारित फ़ंक्शन सभी मामलों में (यानी पहले क्लिक पर भी कहा जाता है) जब तक कोई बॉक्स अभी तक विस्तारित नहीं हुआ है)। –

1

आप फ़ंक्शन में दूसरे एनीमेशन कोड को समाहित कर सकते हैं और फिर उस एनीमेशन को कॉल करने से पहले एनीमेशन या कॉलबैक से कॉल करें, अगर पहली एनीमेशन नहीं होती है तो उसे कॉल करें। विचार यह मानते हुए कुछ अन्य नियंत्रण है कि पिछले एक क्लिक से "का विस्तार-बॉक्स" वर्ग था हटना है:

$('.box').on('click', function() { 
    var $this = $(this), 
     $exp = $(".expanded-box"); 

    function grow() { 
     $this.animate({ 
      width: "200px", height: "100px" 
     }).addClass('expanded-box'); 
    } 

    if ($exp.length > 0) { 
     $exp.animate({ 
      width: "100px", height: "50px" 
     }, grow).removeClass("expanded-box"); 
    } else { 
     grow(); 
    }   
});​ 

डेमो: http://jsfiddle.net/PXddm/

+0

कूल। मैंने इस बारे में सोचा था, लेकिन एक और अधिक सुरुचिपूर्ण समाधान की उम्मीद कर रहा था। मैंने सोचा कि jQuery में कुछ प्रकार की एनीमेशन कतार सुविधा थी। – CaptSaltyJack

+0

निश्चित रूप से एक एनिमेशन कतार सुविधा है। यह केवल प्रति तत्व लागू होता था, लेकिन "jQuery 1.7 के रूप में, कतार विकल्प एक स्ट्रिंग भी स्वीकार कर सकता है, जिस स्थिति में एनीमेशन उस स्ट्रिंग द्वारा प्रदर्शित कतार में जोड़ा जाता है।" - लेकिन मैंने कभी भी उस सुविधा का उपयोग नहीं किया है, इसलिए मुझे यकीन नहीं है कि यह वास्तव में कैसे काम करता है। – nnnnnn

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