In Ruby on Rails versuche ich die innerHTML
eines div-Tags mit dem form_remote_tag
Helfer zu aktualisieren. Diese Aktualisierung findet immer dann statt, wenn ein zugehöriges select-Tag ein onchange-Ereignis empfängt. Das Problem ist <select onchange="this.form.submit();">
; funktioniert nicht. Noch tut document.forms[0].submit()
. Die einzige Möglichkeit, den Code oninsubmit zu erhalten, der in form_remote_tag generiert wird, besteht darin, eine verborgene Übergabeschaltfläche zu erstellen und die click-Methode auf der Schaltfläche des select-Tags aufzurufen. Hier ist ein funktionierendes ERB-Teilbeispiel.Ist es möglich, Javascript onsubmit-Ereignis programmgesteuert auf einem Formular aufzurufen?
<% 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 %>
Was ich tun möchte, ist so etwas, aber es funktioniert nicht.
<% 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 %>
Also gibt es eine Möglichkeit, die unsichtbare Senden-Schaltfläche für diesen Anwendungsfall zu entfernen?
Es scheint etwas Verwirrung zu geben. Also, lass mich das erklären. Das grundlegende Problem ist, dass submit()
den onsubmit()
-Code nicht aufruft, der in dem Formular gerendert wird.
Die eigentliche HTML-Formular, dass Rails aus dieser ERb macht sieht wie folgt aus:
<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>
ich die unsichtbare Submit-Button Axt wollen, scheint aber eine gerade form.submit mit zu arbeiten, um nicht. Also muss ich den Onsubmit-Ereigniscode des Formulars aufrufen.
Update: Orion Edwards Lösung würde funktionieren, wenn es keine return(false);
von Rails generiert. Ich bin mir nicht sicher, was schlimmer ist, indem ich einen Phantom-Klick auf eine unsichtbare Schaltfläche zum Senden abschicke oder eval auf den Aufruf getAttribute('onsubmit')
aufruft, nachdem ich den Return-Aufruf mit einem Javascript-String-Ersatz entfernt habe!
Dies funktioniert in der Theorie, aber ich verwende immer noch meinen ursprünglichen Code in der Produktion, nur um zu vermeiden, ein Eval zu verwenden. – hoyhoy