2010-03-12 12 views
26

मान लें कि मेरे पास कई एनिमेशन एक साथ चल रहे हैं, और एक बार जब वे सभी समाप्त हो जाएंगे तो मैं एक फ़ंक्शन कॉल करना चाहता हूं।jQuery, एकाधिक एनिमेशन के बाद केवल एक बार कॉलबैक को कॉल करना

केवल एक एनीमेशन के साथ, यह आसान है; इसके लिए एक कॉलबैक है। उदाहरण के लिए:

$(".myclass").fadeOut(slow,mycallback); 

समस्या है, अगर मेरे चयनकर्ता को कई आइटम मिलते हैं, तो उनमें से प्रत्येक के लिए कॉलबैक बुलाया जाएगा।

एक कामकाज बहुत कठिन नहीं है; उदाहरण के लिए:

<!DOCTYPE html> 
<html> 
<head> 
    <title>Example</title> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"></script> 
    <script type="text/javascript"> 
    $(document).ready(function() { 
     var $mc=$(".myclass"),l=$mc.length; 
     $mc.fadeOut("slow",function(){ 
     if (! --l) $("#target").append("<p>All done.</p>"); 
     }); 
    }); 
    </script> 
    <style type="text/css"> 
    </style> 
</head> 
<body> 
    <p class="myclass">Paragraph</p> 
    <p class="myclass">Paragraph</p> 
    <p class="myclass">Paragraph</p> 
    <p class="myclass">Paragraph</p> 
    <p class="myclass">Paragraph</p> 
    <p class="myclass">Paragraph</p> 
    <div id="target"></div> 
</body> 
</html> 

मेरा प्रश्न है: क्या ऐसा करने का एक बेहतर तरीका है?

+0

ज्यादातर मामलों में, मैं काउंटर के बजाय एक बूलियन का उपयोग करता हूं (इसलिए पहली एनीमेशन के अंत में कार्रवाई की जाती है), लेकिन अन्यथा यह वही विधि है। अच्छा सवाल है, मैं अन्य तरीकों से उत्सुक हूं। वास्तव में –

+0

। आप उन सभी के लिए इंतजार करना चाहते हैं यदि उदाहरण के लिए आपके सभी एनिमेशन एक ही लंबाई के नहीं हैं (मेरे सरल उदाहरण में नहीं), और आप चीजों को आगे बढ़ने के बाद कुछ करना चाहते हैं, या अपने ब्राउज़र पर लुप्त होना चाहते हैं। –

उत्तर

29

आप उन सभी के लिए एक ही कॉलबैक चला सकते हैं, लेकिन केवल if खंड पर अमल करता है, तो वर्तमान में कोई भी अब और एनिमेटेड किया जा रहा है, इस तरह:

$(".myclass").fadeOut("slow", function() { 
    if ($(".myclass:animated").length === 0) 
     $("#target").append("<p>All done.</p>"); 
    }); 

यदि कोई अभी भी के माध्यम से एनिमेटेड किया जा रहा है यह सिर्फ जाँच करता है :animated selector। आप स्थानों के बहुत सारे में यह प्रयोग कर रहे हैं

$(".myclass:animated, .myClass2:animated") 

, मुझे लगता है कि एक onFinish फ़ंक्शन कॉलबैक बनाने चाहते हैं: आप अलग अलग बातें की बहुत सारी एनिमेट रहे थे तो इसी सिद्धांत का उपयोग, बस चयनकर्ता के इस तरह जोड़ने या इसे साफ करने के लिए कुछ।

+0

अच्छा, मुझे इसका निश्चित पहलू पसंद है। –

+0

मुझे यह भी पसंद है, +1 –

+0

इस समस्या में भी भाग लें। चालाक समाधान। –

3

मेरे मामले में मैं इस धागे पर चर्चा में

if ($(".myclass:animated").length === 1) 
42

देखो को परिभाषित करने के लिए है: jQuery $.animate() multiple elements but only fire callback once

.when()/.then() और .promise().done(callback()); कार्यों एक भी बुला की समस्या के लिए एक और अधिक सुरुचिपूर्ण समाधान प्रदान करते हैं सभी एनिमेशन के अंत में कॉलबैक।

+12

यह सही जवाब होना चाहिए। –

+1

अच्छी कॉल। इसी तरह, यह अंतिम तत्व एनामीटिंग के बाद कॉलबैक को आग लगाने के लिए कतार का उपयोग करता है: elements.fadeOut (330) .last()। Queue (function() {}); – Tyler

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