2010-06-11 8 views
9

सफलता कॉलबैक फ़ंक्शन लॉग के नीचे कोड उदाहरण में प्रत्येक इनपुट इनपुट के बजाय चार बार 'इनपुट # 04.update' लॉग करता है, जो यह समझ में आता है कि बंद कैसे काम करता है लेकिन मैं प्रत्येक को लक्षित करने के बारे में कैसे जाऊं इसका उपयोग कर व्यक्तिगत इनपुट।AJAX क्लोजर और लक्ष्यीकरण 'यह'

<input type="text" name="" id="01" class="update"> 
<input type="text" name="" id="02" class="update"> 
<input type="text" name="" id="03" class="update"> 
<input type="text" name="" id="04" class="update"> 

function updateFields(){ 
$('input.update').each(function(){ 
    $this = $(this); 
    $.ajax({ 
     data: 'id=' + this.id, 
     success: function(resp){ 
     console.log($this); 
      $this.val(resp) 
     } 
    }); 
    }); 
} 

उत्तर

12

आप var

var $this = $(this); 

भूल मत भूलना var। एक प्रोग्रामर जो var भूल गया रात में बिस्तर पर गया और अपने अपार्टमेंट को आग लगने के लिए जाग गया। उन्होंने var जोड़ा और आग निकल गई। एक और प्रोग्रामर varपूरी तरह से यूरोप के लिए एक व्यापार यात्रा पर जाने से पहले छोड़ दिया। एयरप्लेन ने टेकऑफ के तुरंत बाद उड़ान की यांत्रिक समस्याओं का विकास किया, जिससे पायलट आपातकालीन लैंडिंग प्रक्रिया शुरू कर रहा था। अपने लैपटॉप से ​​प्रोग्रामर ने तुरंत var जोड़ा और विमान ने इसे हवाई अड्डे पर सुरक्षित रूप से बनाया।

var मत भूलना। यदि आप अपने कोड में var डालते हैं, तो आप आज किसी विशेष से मिलेंगे। कोशिश करो। यह आश्चर्यजनक लगता है लेकिन यह वास्तव में काम करता है!

function updateFields(){ 
$('input.update').each(function(){ 
    $.ajax({ 
     data: 'id=' + this.id, 
     success: $.proxy(function(resp){ 
       $(this).val(resp); 
       }, this) 
    }); 
    }); 
} 

यह बंद निर्माता this कर देगा इनपुट तत्व का उल्लेख है जब आप success कॉलबैक, जो आमतौर पर है अंदर कर रहे हैं:

+0

यह आश्चर्यजनक है ... लेकिन ... क्या आप मुझे ऐसा करने का तकनीकी कारण बता सकते हैं? मेरा मतलब है, मैं कभी-कभी 'var' जोड़ना भूल जाता हूं ... और मुझे कोई समस्या नहीं है। लेकिन आपके शब्द डरावने हैं, और अब से मैं 'var' जोड़ना नहीं भूलूंगा। वैसे भी ... क्या आपके पास इस तरह की समस्याओं के लिए तकनीकी स्पष्टीकरण है? – Cristian

+0

कारण: आपकी 'सफलता' हैंडलर, अज्ञात फ़ंक्शन एक '$ this' चर का संदर्भ देता है जो वैश्विक है। तो इस अज्ञात फ़ंक्शन के 4 उदाहरणों में से प्रत्येक एक ही चर का संदर्भ देता है और इसलिए वही मान, क्योंकि प्रत्येक 'फ़ंक्शन' लौटने के बाद उन्हें निष्पादित किया जाता है। – Alsciende

+1

@ क्रिस्टियन - 'var' के बिना, यह एक वैश्विक चर है जो आप प्रत्येक लूप को अपडेट कर रहे हैं, इस बंदरगाह के दायरे में स्थानीय नहीं, जो आप चाहते हैं कि यह इस मामले में हो। –

3

नुकीले के var उपयोग पर सही, एक और विकल्प इस तरह $.proxy() उपयोग करने के लिए, है आप इसके बाद क्या कर रहे हैं ... इसलिए मुझे यकीन नहीं है कि यह डिफ़ॉल्ट रूप से क्यों नहीं है, लेकिन किसी भी मामले में $.proxy() स्थिति को सुधारता है।

+0

+1। – user113716

+0

'$ .proxy() 'अच्छा है, लेकिन मेरी इच्छा है कि यह" पैरामीटर स्टफिंग "या नकली करीबी का भी समर्थन करे जो प्रोटोटाइप का' .बिंद 'समर्थन करता है। अब मुझे यह देखने के लिए जांच करनी होगी कि नया ईसीएमएस्क्रिप्ट 5 '.बिंद' प्रोटोटाइप की तरह है या नहीं। – Pointy

+0

@ पॉइंटी - दूसरा '$ .proxy()' दृष्टिकोण इस तरह के कुछ उत्परिवर्तन कर सकता है कि आप इसे कैसे बनाते हैं ... लेकिन हाँ यह प्रोटोटाइप के बराबर नहीं है, लेकिन मुझे लगता है कि यह वास्तव में बहुत कुछ नहीं खो रहा है ... मुझे लगता है कि 2 पुस्तकालय बस बंद करने के संबंध में बाध्यकारी और पुनरावृत्ति के लिए एक बहुत अलग दृष्टिकोण लेते हैं, jQuery बेहतर या बदतर के लिए, रास्ते में आपके लिए और अधिक बनाता है। –

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