2009-08-20 12 views
9

कुछ पृष्ठभूमि:उत्सुक: क्या गतिशील अजाक्स डेटा परिवर्तनीय नाम होना संभव है?

हाल ही में एक परियोजना पर, मुझे लगता है कि कुछ अजाक्स जब विभिन्न आदानों अपडेट किए गए थे किए गए कॉल को संभालने होगा एक सुव्यवस्थित jQuery प्लगइन लिखने का प्रयास किया। मैं एक प्लगइन के रूप में JavaScript फ़ंक्शन लिखा था ताकि मैं सिर्फ विभिन्न आदानों पर यह कह सकते हैं, तो जैसे: फिर

$("#email").updateChanges(); 

, प्लगइन के भीतर से, मैं इनपुट की आईडी, मूल्य, आदि एकत्र

समस्या:

कुछ जो मैं वास्तव में करना चाहता था, लेकिन समाधान नहीं मिला, गतिशील रूप से AJAX के माध्यम से पारित डेटा चर का नाम उत्पन्न करना था।

अधिक स्पष्ट है, इस समारोह को देखते हुए:

jQuery.fn.updateChanges = function(){ 

    this.bind('blur',function(){ 

     var inputName = $(this).attr("name"); 
     var inputValue = $(this).val(); 

     $.post('/ajax/updateValue.php', 
     { email: inputValue }, function(ret){ 
      if (ret=='success') alert("all good!"); 
     } 

    } 

} 

... कैसे मैं { password: inputValue } बजाय { email: inputValue } के रूप में अजाक्स कॉल के लिए डेटा प्रस्तुत करते inputName चर "पासवर्ड" के बजाय है "ईमेल"? यह एक बहुत ही विशिष्ट उदाहरण है, लेकिन मूल रूप से मैं डेटा वैरिएबल के नाम को एक अलग गतिशील चर से पढ़ने का तरीका ढूंढ रहा हूं।

मैंने window[inputName] को कोई भाग्य नहीं दिया, और मुझे बहुत आश्वस्त है कि यह असंभव है। हालांकि, अगर किसी के पास कोई विचार है, तो मैं बहुत प्रभावित हूं।

संयोग से, हम इसके बजाय { type: inputName, value: inputValue } के साथ जा रहे थे, लेकिन PHP पक्ष पर थोड़ा और अधिक लेगवर्क की आवश्यकता थी (मुझसे मत पूछो, मैं सिर्फ फ्रंट एंड लड़का हूं :)।

अग्रिम धन्यवाद!

+0

तुम कैसे करने के लिए वांछित चर नाम से संवाद करने की योजना बना रहे हैं कार्यक्रम? क्या यह एक पैरामीटर होगा? – JorenB

उत्तर

20

अगर मैं तुम्हें सही ढंग से समझ, यह आप क्या कर रहे हैं के बाद:

jQuery.fn.updateChanges = function(){ 

    this.bind('blur',function(){  

     var data = {}; 
     data[$(this).attr("name")] = $(this).val(); 

     $.post('/ajax/updateValue.php', 
     data, 
     function(ret){ 
      if (ret=='success') alert("all good!"); 
     }  
    }  
} 

आपका मुख्य मुद्दा वस्तु शाब्दिक अंकन का उपयोग एक गतिशील मूल्य उपयोग करने का प्रयास किया गया था, कुछ तुम सच में बुरा पर वापस लौट रहा बिना नहीं कर सकते प्रथाओं (जैसे eval() का उपयोग करना जहां eval() संबंधित नहीं है;)।

var myObj = { 'n1': 'v1' }; 

बराबर है करने के लिए:

var myObj = {}; // {} = new Object(); 
myObj['n1'] = 'v1'; 

के बराबर है:

var myObj = {}, 
    myKey = 'n1', 
    myVal = 'v1'; 

myObj[myKey] = myVal; 
+0

वाह, यह बहुत अच्छा है। ठीक वही जो मेरे द्वारा खोजा जा रहा था। सीखने के लिए बहुत कुछ! –

+0

(और बहुत बहुत धन्यवाद, लियोर!) –

-1

इस के साथ प्रयास करें:

jQuery.fn.updateChanges = function(){ 

    this.bind('blur',function(){ 

     var inputName = $(this).attr("id"); 
     var inputValue = $(this).val(); 
     var data = eval("{"+ inputName +":"+ inputValue +" }"); 

     alert("send: "+ inputName+"\n"+data[inputName]); 

     $.post('/ajax/updateValue.php', 
     data, function(ret){ 
      if (ret=='success') alert("all good!"); 
     } 

    } 

} 
+2

eval धीमी, गंदे और खतरनाक है। इससे बचो। – Quentin

+1

ठीक है, हम इसे 3725 "jQuery-1.3.2.js" -> 'विंडो ["eval"]' की लाइन में बदलने के लिए जॉन रेसिग को अग्रेषित करेंगे। आपके कारण मुझे लगता है कि कोई भी jQuery का उपयोग नहीं करता है। कौन सही है? विंडो ["eval"] मूल "eval()" –

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