2011-01-23 16 views
7

मैं इस तरह की वस्तुओं का एक सेट से प्रत्येक के लिए एक धारावाहिक वर्ग को जोड़ने की कोशिश की:क्या jQuery की "प्रत्येक()" विधि लूप के लिए है?

jQuery('#preload img').each(function(){ 
    jQuery('#thumbs').append('<img class="index' + index + '" src="' + source + '" />'); 
    index = ++index; 
    }); 

और यह काम किया। परिणामस्वरूप छवियों का एक सेट था, प्रत्येक वर्ग image1, image2, और इसी तरह के साथ। यह वही है जो मैं चाहता था। लेकिन क्या यह वास्तव में वस्तुओं के एक सेट के माध्यम से लूपिंग का एक विश्वसनीय तरीका है? या यह संभव है कि, अगर इस अज्ञात फ़ंक्शन को निष्पादित करने में अधिक समय लगेगा, तो index से पहले कार्य अगली ऑब्जेक्ट पर शुरू हो सकता है?

कोई भी जानता है कि वास्तव में क्या हो रहा है?

+4

एफडब्ल्यूआईडब्ल्यू एक और अधिक प्रदर्शन दृष्टिकोण उस लूप से पहले एक खाली स्ट्रिंग को प्रारंभ करना होगा, लूप के माध्यम से हर बार इसे संयोजित करें, फिर '$ (...) लूप खत्म होने के बाद स्ट्रिंग को एक बार जोड़ दें। डोम कुख्यात धीमा है। –

उत्तर

8

यह अंदरूनी कामकाज है each फ़ंक्शन (1.4.4):

// args is for internal usage only 
each: function(object, callback, args) { 
    var name, i = 0, 
     length = object.length, 
     isObj = length === undefined || jQuery.isFunction(object); 

    if (args) { 
     if (isObj) { 
      for (name in object) { 
       if (callback.apply(object[ name ], args) === false) { 
        break; 
       } 
      } 
     } else { 
      for (; i < length;) { 
       if (callback.apply(object[ i++ ], args) === false) { 
        break; 
       } 
      } 
     } 

    // A special, fast, case for the most common use of each 
    } else { 
     if (isObj) { 
      for (name in object) { 
       if (callback.call(object[ name ], name, object[ name ]) === false) { 
        break; 
       } 
      } 
     } else { 
      for (var value = object[0]; 
       i < length && callback.call(value, i, value) !== false; value = object[++i]) {} 
     } 
    } 

    return object; 
} 

आप यहां देख सकते हैं कि इसमें कुछ अलग-अलग मामले हैं लेकिन उनमें से सभी for लूप का उपयोग करते हैं और कॉलबैक फ़ंक्शन को कॉल करते हैं। तो आपका कोड ठीक होना चाहिए।

आप इसे jQuery के विकास संस्करण में देख सकते हैं (मुख्य jQuery साइट पर रेडियो बटन बदलें, या here पर क्लिक करें)।

+0

+1 - कोड वॉल्यूम बोलता है। अच्छा उत्तर। – jmort253

+0

++ 1 :) ........ –

5

.each() वास्तव में अनिवार्य रूप से एक पाश के लिए है और यह भी एक सूचकांक में बनाया गया है यदि आप इस तरह के तर्क में पास करते हैं तो आप इसका उपयोग कर सकते हैं:

jQuery('#preload img').each(function(i){ 
    jQuery('#thumbs').append('<img class="index' + i + '" src="' + source + '" />'); 
}); 

संपादित करें:

var thumbsAppend = ""; 
jQuery('#preload img').each(function(i){ 
    thumbsAppend += '<img class="index' + i + '" src="' + source + '" />'; 
}); 
jQuery('#thumbs').append(thumbsAppend); 

संपादित करें # 2:: और राहुल की सरणी धक्का सुझाव: केन Franqueiro की स्ट्रिंग संयोजन सुझाव के साथ बोनस कार्यान्वयन

var thumbsAppend = []; 
jQuery('#preload img').each(function(i){ 
    thumbsAppend.push('<img class="index' + i + '" src="' + source + '" />'); 
}); 
thumbsAppend = thumbsAppend.join(''); 
jQuery('#thumbs').append(thumbsAppend); 
+0

स्ट्रिंग कॉन्सटेनेशन की बजाय सरणी पुश का उपयोग करने के लिए बेहतर है। – rahul

+1

@rahul, केवल आईई 7 के लिए और निचले हालांकि, अन्य ब्राउज़रों में दोनों विधियां समान हैं, सफारी को छोड़कर जहां कॉन्सट तेजी से होते हैं। बेंचमार्किंग की अद्भुत दुनिया –

+0

आह। सत्य कहा जाता है, 'स्ट्रैट' और 'arr.push' के बीच का अंतर या तो डीओएम समायोजन के बीच अंतर की तुलना में महत्वहीन है। यदि यह एक उचित धीमी कंप्यूटर (नेटबुक?) पर काम करता है, तो आपको ठीक होना चाहिए। – zzzzBov

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