2010-03-03 11 views
12

जारी रखने से पहले प्रत्येक फ़ंक्शन को पूरा करने के लिए प्रतीक्षा करता है यदि यह एक स्पष्ट है तो कृपया मुझे क्षमा करें।jQuery में लूप कैसे लिखें जो लूप

मेरे पास एक पृष्ठ पर अज्ञात तत्व हैं, जिन्हें मुझे एक समय में एक के माध्यम से लूप करने और सामान करने की आवश्यकता है। हालांकि, मुझे तब तक रुकने की आवश्यकता है जब तक तत्वों पर उपयोग किए गए कार्यों को पूरा नहीं किया जाता है, और फिर अगले पुनरावृत्ति पर जारी रहता है।

मैंने इसे $ .ech लूप में करने की कोशिश की, लेकिन इसे पूरा करने के इंतजार किए बिना आदेशों को जल्दी से समाप्त कर दिया गया।

कोई भी विचार?

$('elem').each(function(){ 
    $(this).fadeIn().wait(5000).fadeOut(); 
}); 

यह मेरे पास बहुत सरल है। मुझे यहां से प्रतीक्षा() फ़ंक्शन मिला: jquery cookbook site

समस्या है, लूप प्रतीक्षा नहीं है - वास्तविक आदेश इरादे के अनुसार काम करता है, यह सिर्फ इतना है कि वे सभी एक बार में जाते हैं।

किसी भी मदद की सराहना की, धन्यवाद।

संपादित करें: के बाद से 1.4.2 jQuery मिल गया है: इसके बाद क्रियान्वित किया जाता है, मैं तो पाश फिर से निष्पादित करने के लिए, ताकि elems की सूची/बाहर फिर से अनुक्रम में

EDIT2 में फीका हो जाएगा चाहते हो सकता है lib, 1.3.2 का उपयोग कर रहा था, इसलिए कस्टम प्रतीक्षा() फ़ंक्शन। अब लॉबस्ट्रोसिटी द्वारा उल्लिखित देरी() का उपयोग करना। मुझे अपने जवाब से जो कुछ चाहिए, उसके करीब कुछ इकट्ठा करने के लिए प्रबंधित, धन्यवाद lobstrosity :)।

उत्तर

9

सबसे पहले, jQuery 1.4 delay समारोह है, जो मुझे लगता है जोड़ा क्या है आपका कस्टम प्रतीक्षा कार्यान्वयन कर रहा है।

देरी का उपयोग करके आप नकली के प्रत्येक तत्व पिछले तत्व पर "इंतज़ार कर" एक आरंभिक देरी के लिए एक गुणक के रूप में प्रत्येक कॉलबैक करने के लिए पहले पैरामीटर का उपयोग करके खत्म करने के लिए की कार्यक्षमता सॉर्ट कर सकते हैं। इस तरह:

var duration = 5000; 

$('elem').each(function(n) { 
    $(this).delay(n * duration).fadeIn().delay(duration).fadeOut(); 
}); 

तो पहला तत्व तुरंत फीका होगा। दूसरा 5,000 एमएस के बाद फीका होगा। 10,000 एमएस के बाद तीसरा और इसी तरह। ध्यान रखें कि यह इसे फिक्र कर रहा है। प्रत्येक तत्व वास्तव में पिछले तत्व को खत्म करने के लिए इंतजार नहीं कर रहा है।

+0

aaaahh यह काफी करीब है, धन्यवाद। और मैं 1.3.2 का उपयोग कर रहा था, बस नवीनतम lib मिला, यह इंगित करने के लिए धन्यवाद। इस के साथ एकमात्र मुद्दा यह है कि एक बार जब मैं $ ('elem') पर कार्रवाई करता हूं, तो मैं इसे फिर से करना चाहूंगा। मैं इस सवाल को फिर से लिखने के लिए संपादित करूँगा, इसका उल्लेख करना चाहिए, धन्यवाद। – alan

+0

मुझे अभी तक यह सही नहीं मिला है, लेकिन इसने मेरे प्रश्न का उत्तर दिया, बहुत बहुत धन्यवाद। – alan

0

आपको शायद पहले समारोह से पहले प्रतीक्षा कॉल करने की आवश्यकता:

$(this).wait().fadeIn().wait(5000).fadeOut(); 

अन्य विकल्प कॉलबैक उपयोग करने के लिए है।

$(this).wait().fadeIn('slow', function(){$(this).fadeOut('slow')}); 

इस तरह fadeOut fadeIn पूरा होने तक शुरू नहीं होता है।

+0

उत्तर के लिए धन्यवाद, लेकिन fadein और fadeOuts के आदेश, कोई मुद्दा नहीं है यह तथ्य यह है कि चाहते प्रत्येक पाश 0.3 के बारे में एक दूसरे के अंदर उनमें से हर एक कॉल है, और यह सब होने बनाता है उसी समय, मुझे कॉलबैक की प्रतीक्षा करने के लिए लूप की आवश्यकता है। – alan

3

each() का उपयोग करके आपका मुख्य पाश तत्वों के आपके संग्रह पर देरी के बिना चलाएगा। आपको इसके बजाय इन तत्वों को कतारबद्ध करने की आवश्यकता है।

यह हो सकता है फेरबदल (और संभवतः jQuery कतारों का उपयोग कर सकता है?), लेकिन कतार पर कार्रवाई करने के प्रत्यावर्तन का उपयोग कर प्रदर्शन करने की जरूरत:

function animate(elems) { 
    var elem = elems.shift(); 
    $(elem).fadeIn().wait(5000).fadeOut(2000, function() { 
     if (elems.length) { 
      animate(elems); 
     } 
    }); 
} 

var elems = $('elem'); 
animate(elems); 
+0

मुझे लगता है कि इसके लिए तत्वों की एक अज्ञात संख्या ठीक है क्योंकि हम सरणी से अगले elem को 'shift') 'shift') करते हैं। यह केवल एक बार आपके संग्रह पर चलाएगा, फिर समाप्त हो जाएगा। –

+0

शिफ्ट jquery ऑब्जेक्ट पर काम नहीं कर रहा है, मुझे यह त्रुटि मिली: 'TypeError:' अपरिभाषित 'एक फ़ंक्शन नहीं है (' elems.shift() 'का मूल्यांकन) ' – Matthieu

+0

बस समाधान की स्थापना की: get():' var elems = $ ("elem")।(); – Matthieu

0

यहां मेरे solution का डेमो है।

आपको जो चाहिए वह प्रसंस्करण को संभालने के लिए एक लूप नहीं है। आप क्या चाहते हैं कॉल को चेन करना है। ऐसा लगता है कि एक आसान तरीका हो सकता है लेकिन यहां एक ब्रूट-फोर्स विधि है।

// Create a function that does the chaining. 
function fadeNext(x,y) { 
    return function() { x.fadeIn(100).delay(100).fadeOut(1000, (y?y.fadeNext:y)); }; 
} 

// Get all the elements to fade in reverse order. 
var elements = []; 
$('.f').each(function(i,e) {elements.unshift(e);}); 

// Iterate over the elements and configure a fadeNext for each. 
var next; 
for (var i in elements) { 
    var e = $(elements[i]); 
    e.fadeNext = fadeNext(e,next); 
    next = e; 
} 

// Start the fade. 
next.fadeNext(); 
+0

यह एक अच्छा विचार है, पोस्टिंग के लिए धन्यवाद। यह कोड अच्छा है :) – alan