2008-11-02 1 views
8

में एक फॉर्म भरने का सामान्य तरीका मैं जावास्क्रिप्ट का उपयोग कर पैरामीटर स्ट्रिंग के आधार पर एक फॉर्म "भरने" के लिए वास्तव में सामान्य तरीका ढूंढ रहा हूं।जावास्क्रिप्ट

उदाहरण के लिए

, अगर मैं इस फार्म है:

<form id="someform"> 
    <select name="option1"> 
    <option value="1">1</option> 
    <option value="2">2</option> 
    </select> 
    <select name="option2"> 
    <option value="1">1</option> 
    <option value="2">2</option> 
    </select> 
</form> 

मैं चाहूँगा इस तरह का कोई पैरामीटर स्ट्रिंग लेने के लिए सक्षम होने के लिए: option1=2&option2=1

और फिर राशि सही चीजों के आधार पर चुना क्वेरी स्ट्रिंग में विकल्प।

मेरे पास एक प्रकार का बदसूरत समाधान है जहां मैं फॉर्म के बच्चों के माध्यम से जाता हूं और जांचता हूं कि क्या वे विभिन्न चाबियों से मेल खाते हैं, फिर मान सेट करते हैं, लेकिन मुझे वास्तव में यह पसंद नहीं है।

मुझे क्लीनर, जेनेरिक ऐसा करने का तरीका है जो किसी भी रूप के लिए काम करेगा (पैरामीटर स्ट्रिंग को सभी सही कुंजी मानते हैं)।

मैं प्रोटोटाइप जावास्क्रिप्ट लाइब्रेरी का उपयोग कर रहा हूं, इसलिए मैं उन सुझावों का स्वागत करता हूं जो इसका लाभ उठाते हैं।

संपादित करें: यह है कि क्या मैं अब तक (Form.getElements(form) के लिए प्रोटोटाइप का उपयोग कर)

function setFormOptions(formId, params) { 
    params = params.split('&'); 
    params.each(function(pair) { 
    pair = pair.split('='); 
    var key = pair[0]; 
    var val = pair[1]; 
    Form.getElements(form).each(function(element) { 
     if(element.name == key) { 
     element.value = val; 
     } 
    }); 
    }); 
} 

मैं हालांकि लगता है कि यह अभी भी तेजी से हो सकता है/क्लीनर के साथ आ गया है।

उत्तर

6

आप प्रोटोटाइप का उपयोग कर रहे हैं, यह आसान है। सबसे पहले, आप प्रत्येक पैरामीटर के लिए नाम/मूल्य जोड़े के साथ जावास्क्रिप्ट ऑब्जेक्ट प्राप्त करने के लिए स्ट्रिंग ऑब्जेक्ट पर toQueryParams विधि का उपयोग कर सकते हैं।

दूसरा, आप प्रत्येक क्वेरी स्ट्रिंग मान को वास्तविक रूप इनपुट इनपुट स्थिति (उदाहरण के लिए) का उपयोग करने के लिए Form.Elements.setValue विधि (दस्तावेज़ीकरण प्रतीत नहीं होता) का उपयोग कर सकते हैं।क्वेरी स्ट्रिंग मान "चालू" होने पर चेकबॉक्स चेक करें)। Name.value = value तकनीक का उपयोग केवल पाठ के लिए काम करता है और (एक, बहुत से नहीं) इनपुट का चयन करें। प्रोटोटाइप विधि का उपयोग चेकबॉक्स के लिए समर्थन जोड़ता है और (एकाधिक) इनपुट का चयन करता है।

आपके पास जो कुछ है, उसे बनाने के लिए एक साधारण कार्य के लिए, यह अच्छी तरह से काम करता है और यह जटिल नहीं है।

function populateForm(queryString) { 
    var params = queryString.toQueryParams(); 
    Object.keys(params).each(function(key) { 
     Form.Element.setValue($("someform")[key], params[key]); 
    }); 
} 

यह Object.keys और each तरीकों का उपयोग करता प्रत्येक क्वेरी स्ट्रिंग पैरामीटर से अधिक पुनरावृति और क्वेरी पैरामीटर वस्तु में मिलान मूल्य के लिए मिलान प्रपत्र इनपुट (इनपुट नाम विशेषता का प्रयोग करके) स्थापित करने के लिए।

संपादित करें: नोट के लिए उसकी पहचान है की जरूरत नहीं है इस समाधान काम करने के लिए अपने प्रपत्र तत्वों पर जिम्मेदार बताते हैं। prototype.js में कोड की

+0

+1 मुझे उस विधि का बिल्कुल कोई संकेत नहीं था। यह भविष्य में एक बड़ा समय बचाने वाला होने वाला है। धन्यवाद। –

+0

'document.someform' को' $ (formId) में बदलना समाप्त हो गया है और यह वही है जो मैं ढूंढ रहा था। एक बार फिर धन्यवाद! –

+0

कुंजी मूल्य जोड़े तक पहुंचने के लिए आप Hash.each विधि का उपयोग करके कोड को छोटा कर सकते हैं: $ एच (queryString.toQueryParams())। प्रत्येक (फ़ंक्शन (जोड़ी) { फॉर्म। एलिमेंट.सेट वैल्यू ($ ("कुछफॉर्म") [pair.key], पैराम्स [pair.value]); }); – aemkei

1

आपने कहा कि आप पहले से ही तत्वों के माध्यम से जा रहे हैं और मूल्यों को सेट कर रहे हैं। हालांकि, शायद यह क्लीनर है कि आपके पास क्या है?

function setFormSelectValues(form, dataset) { 
    var sel = form.getElementsByTagName("select"); 
    dataset.replace(/([^=&]+)=([^&]*)/g, function(match, name, value){ 
     for (var i = 0; i < sel.length; ++i) { 
      if (sel[i].name == name) { 
       sel[i].value = value; 
      } 
     } 
    });     
} 

फिर आप आवश्यकता होने पर केवल तत्वों को चुनने के बजाय इसे अनुकूलित कर सकते हैं।

+0

मेरे पास जो कुछ भी था, उससे क्लीनर, क्योंकि आपको चाबियाँ/मूल्य बहुत बेहतर तरीके से मिल रहे हैं, लेकिन मैं कुछ और सामान्य के लिए उम्मीद कर रहा हूं। मैंने केवल अपने उदाहरण में चयन किया है लेकिन कई रूपों में अन्य तत्व हैं। –

3

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

Event.observe(window, 'load', function() { 
    var loc = window.location.search.substr(1).split('&'); 

    loc.each(function(param) { 
     param = param.split('='); 
     key = param[0]; 
     val = param[1]; 

     $(key).value = val; 
    }); 
}); 

ऊपर कोड मानता है कि आप प्रत्येक प्रपत्र तत्व करने के लिए आईडी मूल्यों के साथ ही नाम आवंटित।

?key=value&key=value

या

?option1=1&option2=2

आप यह सिर्फ तत्वों के लिए नाम पर रखने के लिए चाहते हैं, तो इसके बाद के संस्करण के बजाय कोशिश:

Event.observe(window, 'load', function() { 
    var loc = window.location.search.substr(1).split('&'); 

    loc.each(function(param) { 
    param = param.split('='); 
    key = param[0].split('_'); 

    type = key[0]; 
    key = key[1]; 
    val = param[1]; 

    $$(type + '[name="' + key + '"]').each(function(ele) { 
     ele.value = val; 
    }); 
}); 
यह रूप में पैरामीटर लेता है

यह कोड पैरामीटर लेता है:

?type_key=value&type_key=value

या

?select_option1=1&select_option2=2
0

तीन लाइनों:

$H(query.toQueryParams()).each(function(pair) { 
    $("form")[pair.key].setValue(pair.value); 
}); 
0

आप formManager का उपयोग कर जावास्क्रिप्ट वस्तु में प्रपत्र डेटा प्राप्त कर सकते हैं।

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