2009-06-11 15 views
19

मैं एक जावास्क्रिप्ट वस्तु एक समारोह है कि एक jQuery each विधि निम्नलिखित की तरह कार्यान्वित होता है बनाने हूँ:

function MyClass { 

    Method1 = function(obj) { 
    // Does something here 
    } 

    Method2 = function() { 
    $(".SomeClass").each(function() { 

     // 1   2 
     this.Method1(this); 

    }); 
    } 

} 

कौन सा वस्तु प्रत्येक THIS है की चर्चा करते हुए? jQuery each पुनरावृत्ति से लौटाई गई वस्तु का जिक्र कर रहा है। हालांकि, मुझे This[1] चाहिए जिसमें कक्षा शामिल है ...

मैं jQuery लूप के भीतर से युक्त कक्षा को कैसे देख सकता हूं?

उत्तर

20

मुझे लगता है कि आप कुछ इस तरह कर सकता है:

function MyClass { 
    Method1 = function(obj) { 
     //do something here 
    } 

    Method2 = function() { 
      var containingClass = this; 
      $(".SomeClass").each(function() { 
      containingClass.Method1(this); 
      }); 
     } 
    } 
} 
+1

कृपया गुंजाइश वर कीवर्ड का उपयोग करने के लिए समारोह containingClass चर। यदि आप नहीं करते हैं तो यह वैश्विक नामस्थान में जाएगा। – tvanfosson

+3

-1 जावास्क्रिप्ट 101: var का उपयोग करें !!!!! – James

+1

उस कंटेनिंग क्लास असाइनमेंट पर एक var फेंको, और यह सोने है .. बिंदु पर, और मेरे पोस्ट कोड का एक सरल संशोधन। (। SomeClass) –

9

से http://docs.jquery.com/Core/each:

इसका मतलब यह है कि हर बार जब पारित कर दिया-इन समारोह निष्पादित किया जाता है (जो प्रत्येक तत्व के लिए एक बार है मिलान) 'इस' कीवर्ड विशिष्ट DOM एलीमेंट का अंक। ध्यान दें कि 'यह' किसी jQuery ऑब्जेक्ट को इंगित नहीं करता है।

व्यक्तिगत रूप से, मैं स्पष्ट मापदंडों का उपयोग करना पसंद। इस तरह, यह और अधिक आसानी से पढ़ी जा सकती है:

$('#rotfl').each(function(index, domObject) 
{ 
    var jQueryObject = $(domObject); 
    // code 
}); 

आपके प्रश्न का उत्तर करने के लिए: जावास्क्रिप्ट गतिशील स्थिर गुंजाइश है। आप निम्न कार्य कर सकते हैं:

var that = this; 
$('#rotfl').each(function(index, domObject) 
{ 
    var jQueryObject = $(domObject); 
    that.DoSomething(); 
    // code 
}); 
+0

मुझे आपकी प्रतिक्रिया का विवरण पसंद है ... –

+0

उर, क्या आपका मतलब शब्दावली नहीं है, गतिशील नहीं? – James

+0

जे-पी: हां। इस पर ध्यान दिलाने के लिए धन्यवाद। –

4

आप जो देख रहे jQuery या अपनी each() विधि के साथ कोई समस्या नहीं है - यह है कि क्या कुछ लोगों को JavaScript में एक डिजाइन त्रुटि पर विचार - एक नेस्टेड समारोह पिछले दायरे के संदर्भ को "उत्तराधिकारी" होना चाहिए, इसलिए 'यह' एक मूल संदर्भ में 'इस' के बराबर होना चाहिए जब तक कि उद्देश्य से किसी भिन्न संदर्भ में (apply() या call()) के उद्देश्य से उद्देश्य से कहा जाना चाहिए।

यह आप 'इस' ताकि आप एक और तरीका है इसे संदर्भ के लिए है नेस्टेड समारोह से पहले एक चर के लिए आवंटित करने के लिए की जरूरत है चारों ओर पाने के लिए।

+0

यह वास्तव में jQuery.each() के साथ करना है, जो कॉल() (सबसे आम मामले में) का उपयोग करके काम करता है या लागू होता है() और इस प्रकार ऑब्जेक्ट को बदलता है जो * यह * संदर्भित करता है। – NickFitz

+0

हां, लेकिन अगर jQuery ने कॉल नहीं किया()/लागू() फ़ंक्शन 'यह' अभी भी अपेक्षित नहीं होगा। इसे आज़माएं (फ़ंक्शन() {(फ़ंक्शन() {अलर्ट (!! this.works);/* मौजूद नहीं है * /})()})। कॉल ({works: true}); – James

2

jQuery 1.3.3 के लिए आपको मैन्युअल ईवेंट हैंडलर्स और इस तरह हेतु संदर्भ निर्धारित करने में सक्षम हो जाएगा।

jQuery Edge: Bind with a Different “this”

इस बीच, यहां विभिन्न तकनीकों (अलियासिंग "इस", कॉल का उपयोग कर/लागू) आम बात कर रहे हैं। दोजो के पीटर हिगिन्स ने भी jQuery.hitch plugin बनाया है, जो एक ही ज़रूरत परोसता है।

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