En Ruby on Rails, estoy intentando actualizar el innerHTML
de una etiqueta div usando el ayudante form_remote_tag
. Esta actualización ocurre siempre que una etiqueta de selección asociada recibe un evento onchange. El problema es <select onchange="this.form.submit();">
; no funciona Tampoco lo hace document.forms[0].submit()
. La única forma de ejecutar el código onsubmit generado en form_remote_tag es crear un botón de envío oculto e invocar el método de clic en el botón de la etiqueta de selección. Aquí hay un ejemplo parcial de ERb que funciona.¿Es posible invocar el evento onsubmit de Javascript programáticamente en un formulario?
<% 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 %>
Lo que quiero hacer es algo como esto, pero no funciona.
<% 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 %>
Entonces, ¿hay alguna manera de eliminar el botón de envío invisible para este caso de uso?
Parece haber alguna confusión. Entonces, déjame explicarte. El problema básico es que submit()
no llama al código onsubmit()
representado en el formulario.
El formulario HTML real que hace que los carriles de esta ERb se parece a esto:
<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>
Quiero hacha lo invisible botón de enviar, pero utilizando un form.submit recta parece no funcionar. Entonces, necesito alguna forma de llamar al código de evento onsubmit del formulario.
Actualización: la solución de Orion Edwards funcionaría si no hubiera un return(false);
generado por Rails. No estoy seguro de que es peor, enviando un clic fantasma a un botón de envío invisible o llamando a eval en la llamada getAttribute('onsubmit')
después de eliminar la devolución de llamada con un reemplazo de cadena de JavaScript.
Esto funciona en teoría, pero todavía uso mi código original en producción solo para evitar tener que usar una evaluación. – hoyhoy