2008-08-29 14 views
6

रेल पर रूबी में, मैं form_remote_tag सहायक का उपयोग कर एक div टैग के innerHTML को अपडेट करने का प्रयास कर रहा हूं। यह अद्यतन तब होता है जब एक संबंधित चयन टैग एक अस्थायी घटना प्राप्त करता है। समस्या है, <select onchange="this.form.submit();">; काम नहीं करता न ही document.forms[0].submit() है। Form_remote_tag में निष्पादित ऑनसबमिट कोड प्राप्त करने का एकमात्र तरीका एक छुपा सबमिट बटन बनाना है, और चयन टैग से बटन पर क्लिक विधि का आह्वान करना है। यहां एक काम कर रहे ईआरबी आंशिक उदाहरण है।क्या जावास्क्रिप्ट के ऑनसममिट ईवेंट को प्रोग्राम पर प्रोग्राम रूप से कॉल करना संभव है?

<% form_remote_tag :url => product_path, :update => 'content', :method => 'get' do -%> 
    <% content_tag :div, :id => 'content' do -%> 
    <%= select_tag :update, options_for_select([["foo", 1], ["bar", 2]]), :onchange => "this.form.commit.click" %> 
    <%= submit_tag 'submit_button', :style => "display: none" %> 
    <% end %> 
<% end %> 

मैं ऐसा कुछ करना चाहता हूं, लेकिन यह काम नहीं करता है।

<% form_remote_tag :url => product_path, :update => 'content', :method => 'get' do -%> 
    <% content_tag :div, :id => 'content' do -%> 
    # the following line does not work 
    <%= select_tag :update, options_for_select([["foo", 1], ["bar", 2]]), :onchange => "this.form.onsubmit()" %> 
    <% end %> 
<% end %> 

तो, क्या इस उपयोग के मामले में अदृश्य सबमिट बटन को हटाने का कोई तरीका है?

कुछ भ्रम प्रतीत होता है। तो, मुझे समझाओ। मूल समस्या यह है कि submit() प्रपत्र में प्रस्तुत onsubmit() कोड को कॉल नहीं करता है।

वास्तविक HTML फार्म का है कि रेल इस ERB से renders इस तरह दिखता है:

<form action="/products/1" method="post" onsubmit="new Ajax.Updater('content', '/products/1', {asynchronous:true, evalScripts:true, method:'get', parameters:Form.serialize(this)}); return false;"> 
    <div style="margin:0;padding:0"> 
    <input name="authenticity_token" type="hidden" value="4eacf78eb87e9262a0b631a8a6e417e9a5957cab" /> 
    </div> 
    <div id="content"> 
    <select id="update" name="update" onchange="this.form.commit.click"> 
     <option value="1">foo</option> 
     <option value="2">bar</option> 
    </select> 
    <input name="commit" style="display: none" type="submit" value="submit_button" /> 
    </div> 
</form> 

मैं अदृश्य सबमिट बटन ax चाहते हैं, लेकिन एक सीधी form.submit का उपयोग कर काम नहीं प्रतीत होता है। इसलिए, मुझे फ़ॉर्म के ऑनसममिट ईवेंट कोड को कॉल करने के लिए कुछ तरीका चाहिए।

अद्यतन: अगर वहाँ एक return(false); रेल द्वारा उत्पन्न नहीं था ओरियन एडवर्ड्स समाधान काम करेगा। मुझे यकीन नहीं है कि जो भी बदतर है, एक प्रेत भेजने के लिए एक अदृश्य सबमिट बटन पर क्लिक करें या getAttribute('onsubmit') पर कॉलिंग को जावास्क्रिप्ट स्ट्रिंग प्रतिस्थापन के साथ रिटर्न कॉल को हटाने के बाद कॉल करें!

उत्तर

-3

आप वास्तव में प्रपत्र प्रस्तुत करने के लिए, लेकिन सिर्फ आह्वान जो कुछ कोड ऑनसबमिट में हुआ नहीं करना चाहता था, तो आप संभवतः ऐसा कर सकता है: (untested)

var code = document.getElementById('formId').getAttribute('onsubmit'); 
eval(code); 
+0

यह सिद्धांत में काम करता है, लेकिन मैं अभी भी एक eval का उपयोग करने से बचने के लिए उत्पादन में अपने मूल कोड का उपयोग करता हूं। – hoyhoy

3

अपना फॉर्म id दें।

तो

document.getElementById('formid').submit(); 

आप innerHTML के माध्यम से एक div में जावास्क्रिप्ट लोड कर रहे हैं, तो यह नहीं चलेगा ... बस FYI करें।

2

आप रेल का उपयोग करने के लिए है, तो अंतर्निहित जावास्क्रिप्ट पीढ़ी, मैं ओरियन के समाधान का उपयोग करूंगा, लेकिन रिटर्न कोड की भरपाई करने के लिए एक छोटे बदलाव के साथ।

eval ('(function(){' + code + '})()'); 

हालांकि, मेरी राय में आप एक बाहरी फ़ाइल या अलग प्रतिदेय कार्यों में जावास्क्रिप्ट कोड को अलग करने से लंबे समय में एक आसान समय होगा।

+0

यह वाक्यविन्यास गलत है, लेकिन विचार ठोस है। – hoyhoy

-1

सिद्धांत रूप में, eval ('function(){' + code + '}()'); की तरह कुछ काम कर सकता था (है कि वाक्य रचना हालांकि विफल रहता है)। यहां तक ​​कि अगर यह काम करता है, तो यह अभी भी एक चुनिंदा onchange के माध्यम से एक eval कॉल करने के लिए यहूदी के प्रकार होगा। एक और समाधान रेलवे को onsubmit कोड को चुनिंदा टैग के onchange फ़ील्ड में इंजेक्ट करने के लिए मिलता है, लेकिन मुझे यकीन नहीं है कि ऐसा करने का कोई तरीका है या नहीं। एक्शन व्यू में link_to_remote है, लेकिन onchange फ़ील्ड में एक ही कोड उत्पन्न करने के लिए कोई स्पष्ट सहायक नहीं है।

0

मत करो।

आपके पास एक समाधान है।

स्टॉप, अगले फ़ंक्शन बिंदु पर जाएं।

मुझे पता है, यह सुंदर नहीं है, लेकिन बड़ी समस्याएं हैं।

0

सुनिश्चित नहीं है कि आपके पास अभी तक कोई जवाब है या नहीं, लेकिन onclick चयन के फ़ंक्शन में submit के बजाय onsubmit पर कॉल करें।

5

मुझे एहसास है कि यह प्रश्न पुराना है, लेकिन क्या बिल्ली आप के लिए eval कर रहे हैं?

document.getElementById('formId').onsubmit(); 
document.getElementById('formId').submit(); 

या

document.formName.onsubmit(); 
document.formName.submit(); 

जब एक दस्तावेज़ के डोम भरी हुई है, घटनाओं के तार किसी भी अधिक नहीं हैं, वे कार्य हैं।

alert(typeof document.formName.onsubmit); // function 

इसलिए फ़ंक्शन को स्ट्रिंग में कनवर्ट करने का कोई कारण नहीं है, ताकि आप इसे निकाल सकें।

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

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