2010-10-16 12 views
13

निम्नलिखित काम करता है के रूप में उम्मीद:.each() के साथ jQuery ऑब्जेक्ट्स पर पुनरावृत्ति क्यों करता है मुझे jQuery ऑब्जेक्ट्स नहीं देते?

$(".foo").first().text("hi!") 

... क्योंकि first() रिटर्न एक jQuery वस्तु।

हालांकि, अगर मैं सभी मैचों के लिए text() विधि के साथ काम करना चाहता हूँ, मैं क्या करने की जरूरत:

$(".foo").each(function(idx, obj) { 
    $(obj).text("hi!") 
    } 
) 

... क्योंकि each() देता है आप वस्तुओं Dom।

इस चौंकाने अंतर के पीछे डिजाइन कारण क्या है? मैं प्रत्येक मैच के लिए एक jQuery ऑब्जेक्ट बनाने से कैसे बच सकता हूं?

$('li').each(function(index) { 
    alert(index + ': ' + $(this).text()); 
}); 
पहले लिंक प्रति

:

उत्तर

11

का प्रयास करें? यदि आपको केवल डीओएम ऑब्जेक्ट्स की आवश्यकता है, तो आप चक्र बचाते हैं। यदि आपको jQuery ऑब्जेक्ट की आवश्यकता है, तो आप इसे आसानी से प्राप्त कर सकते हैं।

मैं आमतौर पर प्रत्येक के लिए 2 पैरामीटर प्रदान नहीं करते हैं, तो मैं $ (इस) का उपयोग कर सकते हैं।

+0

बिल्कुल वही जो मैं कहने जा रहा था, प्लस अगर पहले() ने एक jQuery ऑब्जेक्ट वापस नहीं किया है, तो आपको $ ($ (selector)। फर्स्ट()) का उपयोग करना होगा, जो संक्षेप में jQuery के उद्देश्य से कुछ हद तक संघर्ष करता है। –

+0

ठीक है, मैं इस धारणा के तहत था कि '$ ("। Foo ") ने jQuery ऑब्जेक्ट्स को _ से शुरू करने के लिए बनाया है और उन्हें' प्रत्येक() 'के माध्यम से पारित होने पर" मूल "डोम ऑब्जेक्ट्स में विभाजित किया गया था। मुझे लगता है कि यह बिल्कुल नहीं हो रहा है :) – badp

+0

@ जोन - यह सही नहीं है। '$ (चयनकर्ता)। पहला() * * * एक jQuery ऑब्जेक्ट वापस करता है। आपको इसे $ $ ($ (चयनकर्ता) के साथ फिर से लपेटना नहीं चाहिए। सबसे पहले()) '। एकमात्र jQuery विधि (मेरे ज्ञान के लिए) जो एक सादा डीओएम तत्व देता है वह '.get (0)' होता है जब आप इसे एक संख्या पास करते हैं। संख्या तर्क के बिना, आपको डीओएम तत्वों का एक ऐरे मिलता है। – user113716

0

आप देख .eachjQuery.each बनाम

आप निम्न कार्य करने में सक्षम होना चाहिए था। प्रयास करें $(this) बजाय $(obj)

+0

यह कोई सार्थक तरीका अलग नहीं है। मुझे अभी भी jQuery ऑब्जेक्ट्स बनाने की आवश्यकता है। – badp

0

प्रदर्शन बड़े संग्रह के ऊपर पाशन से संबंधित कारणों के लिए संभवतः कारण

$(".foo").each(function(idx, obj) { 
    $(this).text("hi!") 
    } 
) 
+0

'$()' कन्स्ट्रक्टर अभी भी वहां है। – badp

0

मुझे विश्वास है कि जब से jQuery आवरण वस्तुओं का उपयोग करता है, पहली विधि मूल आवरण का उपयोग करता है, और सिर्फ सभी लेकिन आवरण में पहला तत्व निकाल देता है, इस प्रकार यह एक jQuery वस्तु जा रहा रखने।

हालांकि, अगर वे each() फ़ंक्शन के लिए प्रत्येक नोड्स के लिए jQuery ऑब्जेक्ट में फ़ीड करना चाहते थे, तो वे प्रत्येक के लिए रैपर बनाने के ऊपरी हिस्से को लेते थे। और चूंकि आप जरूरी नहीं कि रैपर ऑब्जेक्ट चाहते हैं, तो यह अनावश्यक ओवरहेड होगा।

1

आंतरिक jQuery के लिए $("sel").each(function(){});

if (isObj) { 
    for (name in object) { 
     if (callback.call(object[ name ], name, object[ name ]) === false) { 
      break; 
     } 
    } 
} 

इस फोन और eq एक सरल टुकड़ा है:

eq: function(i) { 
    return i === -1 ? 
    this.slice(i) : 
    this.slice(i, +i + 1); 
} 

तो आप एक नया each समारोह है कि object[name] के बजाय एक object:eq(i)

करना होगा बना सकते हैं
$("*").slice(1,2).toSource() == $("*").eq(1).toSource(); 

तो बनाने के लिए अपने स्वयं के each:

$.fn.each2 = function(callback) 
{ 
    for (var i = 0; i < this.length; ++i) { 
     callback.call(this.eq(i), i, this.eq(i)) 
    } 
}; 

$("*").each2(function(i, obj) { 
    alert(obj); // now obj is a jQuery object 
}); 

ऐसा लगता है each3 तेजी से each2http://www.jsfiddle.net/m7pKk/2/

$.fn.each2 = function(callback) 
{ 
    for (var i = 0; i < this.length; ++i) { 
     var jObj = this.eq(i); 
     callback.call(jObj, i, jObj) 
    } 
}; 

$.fn.each3 = function(callback) 
{ 
    for (var i = 0; i < this.length; ++i) { 
     var jObj = $(this[i]); 
     callback.call(jObj, i, jObj) 
    } 
}; 

See this example on jsFiddle with performance measurement.

+0

तो [यह] (http://gist.github.com/629941) भी काम करेगा? :) इसके अलावा अब मुझे समझने के लिए कुछ प्रोफाइलिंग करने की आवश्यकता है जो भी तेज़ है। – badp

+0

@badp: हां। मुझे नहीं लगता कि 'obj [i]' और 'obj.slice (i, i + 1) 'पर बहुत अंतर है ... उदाहरण यहां देखें http://www.jsfiddle.net/m7pKk/ – BrunoLM

+0

@ ब्रूनोएलएम, वास्तव में '$ ("। Foo ") [i]' एक DOM ऑब्जेक्ट देता है जबकि '$ ("। Foo ")। Eq (i)' एक jQuery ऑब्जेक्ट देता है। यहां बहुत अधिक बिंदु है, और स्लाइस के माध्यम से 'eq' के कार्यान्वयन को देखते हुए मुझे लगभग $ $ ($ ("। Foo ") [i]) विश्वास होता है '' तेज़ होगा ... – badp

1

स्पष्ट प्रदर्शन हिट है कि हो सकता है नहीं है यह है कि लिया प्रति पुनरावृत्ति। एक नया jQuery ऑब्जेक्ट बनाना प्रत्येक पुनरावृत्ति बहुत धीमा और संभवतः बड़े संग्रहों पर ध्यान देने योग्य होगा। अक्सर, आपको लिपटे ऑब्जेक्ट की अतिरिक्त सुविधा की आवश्यकता नहीं होती है, खासकर जब एकल गुण या गुणों तक पहुंच होती है। this.checked के बजाय आप अक्सर $(this).is(":checked") जैसे चक्र बर्बाद करने वाले कोड देखते हैं।

इसके अलावा, मैं कहूंगा कि ऐसा इसलिए है क्योंकि यह समझ में आता है। एक jQuery ऑब्जेक्ट आम तौर पर डीओएम ऑब्जेक्ट्स के संग्रह का प्रतिनिधित्व करता है जो कि आकार में कोई भी संख्या हो सकती है। कभी-कभी jQuery को अपने चयनकर्ता समर्थन और घटना बाध्यकारी के लिए पूरी तरह से उपयोग किया जाता है और उससे परे नहीं। अधिक तत्वों के संग्रह पर पुनरावृत्ति करते समय एक तत्व को संग्रहित करने के लिए यह बहुत अधिक समझ में नहीं आता है। यह एक ऐसी वस्तु को वापस करने के लिए और अधिक समझ में आता है जिसकी आपको अधिक संभावना है, डीओएम तत्व, फिर यदि आप अतिरिक्त सुविधाओं को चाहते हैं तो आप इसे jQuery से लपेट सकते हैं। यह इसे नोडलिस्ट और अन्य प्रकार के संग्रह पर पुनरावृत्त करने के साथ भी रखता है।

0

शायद इसलिए, आपके उदाहरण में each का उपयोग करने का कोई कारण नहीं है। बजाय:

$(".foo").each(function(idx, obj) { 
    $(obj).text("hi!"); 
) 

बस का उपयोग करें:

$(".foo").text("hi!"); 

सब कुछ स्वचालित रूप से बहुवचन है जब jQuery सेट के साथ काम कर।

+1

मुझे प्रति हिट फ़ंक्शन को कॉल करने की आवश्यकता होगी जो केवल '.text()' कॉल से अधिक जटिल है :) – badp

+0

लेकिन यह समस्या के लिए सही हो जाता है - अगर आपको सेट में प्रत्येक आइटम के लिए कुछ अद्वितीय करने की आवश्यकता है , क्या उन्हें ".foo" के साथ सभी को चुनने का भी अर्थ है? – jpsimons

+0

हां, अगर मैं कहना चाहता हूं, प्रत्येक ".foo" में मान में गणितीय फ़ंक्शन लागू करें। वही कार्य, विभिन्न इनपुट, अलग आउटपुट। – badp

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