2013-08-10 4 views
6

कोड की निम्न ब्लॉक के साथ कुछ समस्या आ रही है:jQuery के लिए चाहते प्रत्येक के प्रत्येक यात्रा के बीच देरी को लागू करने() विधि

 $('.merge').each(function(index) { 
      var mergeEl = $(this); 
      setTimeout(function() { 
       self.mergeOne(mergeEl, self, index - (length - 1)); 
      }, 500); 
     }); 

मैं mergeOne की प्रत्येक कॉल के बीच एक .500 सेकंड की देरी लागू करने के लिए कोशिश कर रहा हूँ, लेकिन यह कोड केवल एक साथ सरणी में सभी तत्वों पर mergeOne पर कॉल करने से पहले एक .500 सेकंड देरी लागू करता है।

और किसी समझा सकता है क्यों इस कोड काम नहीं करता है संभवतः एक काम समाधान है कि भयानक होगा, धन्यवाद!

+1

http://stackoverflow.com/a/14786792/2256325 – Sergio

+1

आप '.each()' (कम से कम ठीक से) का उपयोग करने में सक्षम नहीं होंगे। – Ian

उत्तर

7

यहाँ एक सामान्य समारोह आप प्रत्येक यात्रा के बीच देरी से एक jQuery वस्तु के संग्रह के माध्यम से पुनरावृति करने के लिए, का उपयोग कर सकते है:

function delayedEach($els, timeout, callback, continuous) { 
    var iterator; 

    iterator = function (index) { 
     var cur; 

     if (index >= $els.length) { 
      if (!continuous) { 
       return; 
      } 
      index = 0; 
     } 

     cur = $els[index]; 
     callback.call(cur, index, cur); 

     setTimeout(function() { 
      iterator(++index); 
     }, timeout); 
    }; 

    iterator(0); 
} 

डेमो:http://jsfiddle.net/7Ra9K/ (एक बार के माध्यम से लूप)

डेमो:http://jsfiddle.net/42tXp/ (निरंतर लूपिंग)

आपके कॉलबैक में पारित संदर्भ और तर्क समान होना चाहिए कैसे .each() करता है।

आप, यह एक jQuery प्लगइन बनाने के लिए तो यह $("selector").delayedEach(5000, func... की तरह कहा जा सकता है चाहते हैं, तो आप इस इस्तेमाल कर सकते हैं:

डेमो
$.fn.delayedEach = function (timeout, callback, continuous) { 
    var $els, iterator; 

    $els = this; 
    iterator = function (index) { 
     var cur; 

     if (index >= $els.length) { 
      if (!continuous) { 
       return; 
      } 
      index = 0; 
     } 

     cur = $els[index]; 
     callback.call(cur, index, cur); 

     setTimeout(function() { 
      iterator(++index); 
     }, timeout); 
    }; 

    iterator(0); 
}; 

: (एक बार के माध्यम से लूप)http://jsfiddle.net/VGH25/

डेमो:http://jsfiddle.net/NYdp7/ (निरंतर पाशन)


अद्यतन

मैं एक अतिरिक्त पैरामीटर के रूप में तत्वों के माध्यम से क्षमता लगातार करने के लिए लूप कहा,। true पासिंग false या कुछ भी नहीं (या कुछ झूठी) गुजरते समय निरंतर लूप होगा, केवल एक बार तत्वों पर लूप होगा। कोड और पहेलियों में परिवर्तन शामिल हैं।

+1

देरी के लिए धन्यवाद, एक रिकर्सिव फ़ंक्शन का उपयोग करके आप बेहतर हैं! – user2066880

+0

सम्मेलन (जैसे 'setTimeout' के रूप में) के साथ फिट करने के लिए, यह कॉलबैक और फिर देरी नहीं होनी चाहिए? –

+0

@ColinDeClue मैं नहीं मिल तुम्हारा क्या मतलब है - इस तरह से यह है, है यह नहीं है? – Ian

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