Dans Ruby on Rails, j'essaie de mettre à jour le innerHTML
d'une balise div en utilisant l'assistant form_remote_tag
. Cette mise à jour a lieu chaque fois qu'une balise select associée reçoit un événement onchange. Le problème est, <select onchange="this.form.submit();">
; ne fonctionne pas. Pas plus document.forms[0].submit()
. La seule façon d'exécuter le code de sous-instruction généré dans le formulaire_remote_tag est de créer un bouton de soumission masqué et d'appeler la méthode de clic du bouton à partir de la balise de sélection. Voici un exemple partiel d'ERb fonctionnant.Est-il possible d'appeler l'événement onsubmit de Javascript par programmation sur un formulaire?
<% 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 %>
Ce que je veux faire est quelque chose comme ceci, mais cela ne fonctionne pas.
<% 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 %>
Alors, est-il possible de supprimer le bouton de soumission invisible pour ce cas d'utilisation?
Il semble y avoir une certaine confusion. Alors, laissez-moi vous expliquer. Le problème de base est que submit()
n'appelle pas le code onsubmit()
rendu dans le formulaire.
Le formulaire HTML réel qui Rails rend de ce ERb ressemble à ceci:
<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>
Je veux hache l'invisible bouton d'envoi, mais en utilisant un form.submit droit semble ne pas fonctionner. Donc, j'ai besoin d'un moyen d'appeler le code d'événement onsubmit du formulaire.
Mise à jour: la solution Orion Edwards fonctionnerait s'il n'y avait pas de return(false);
généré par Rails. Je ne suis pas sûr de ce qui est pire cependant, en envoyant un clic fantôme à un bouton de soumission invisible ou en appelant eval sur l'appel getAttribute('onsubmit')
après avoir supprimé l'appel de retour avec un remplacement de chaîne javascript!
Cela fonctionne en théorie, mais j'utilise toujours mon code original en production juste pour éviter d'avoir à utiliser un eval. – hoyhoy