E ' possibile chiamare Javascript evento onsubmit a livello di programmazione di un modulo?

StackOverflow https://stackoverflow.com/questions/33860

  •  09-06-2019
  •  | 
  •  

Domanda

In Ruby on Rails, sto tentando di aggiornare il innerHTML di un tag div utilizzando il form_remote_tag helper.Questo aggiornamento avviene ogni qual volta associato un tag select riceve un evento onchange.Il problema è, <select onchange="this.form.submit();">;non funziona.Né document.forms[0].submit().L'unico modo per ottenere l'onsubmit codice generato in form_remote_tag da eseguire è quello di creare un nascosto pulsante "invia", e di invocare il metodo clic sul pulsante selezionare il tag.Ecco un lavoro ERb esempio parziale.

<% 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 %>

Quello che voglio fare è qualcosa di simile a questo, ma non funziona.

<% 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 %>

Così, c'è qualche modo per rimuovere l'invisibile pulsante di invio per questo caso d'uso?

Sembra che ci sia una certa confusione.Quindi, mi permetta di spiegare.Il problema di base è che submit() non chiamare il onsubmit() codice resi in forma.

Il form HTML che Rails rende questo ERb assomiglia a questo:

<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>

Voglio ascia invisibile pulsante di invio, ma l'utilizzo di una forma diritta.invia sembra non funzionare.Così, ho bisogno di qualche modo per chiamare il form onsubmit codice di evento.

Aggiornamento:Orion Edwards soluzione funzionerebbe se non ci fosse un return(false); generato da Rotaie.Io non sono sicuro che è peggio, però, l'invio di un phantom fare clic su un'invisibile pulsante di invio o chiamando eval sul getAttribute('onsubmit') chiamata dopo aver rimosso la chiamata di ritorno con una stringa javascript sostituzione!

È stato utile?

Soluzione

Se non ha in realtà desidera inviare il modulo, ma solo richiamare qualsiasi codice è capitato di essere in onsubmit, si potrebbe fare questo:(non testato)

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

Altri suggerimenti

Mi rendo conto che questa domanda è un po ' vecchio, ma che diamine stai facendo eval per?

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

o

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

Quando il DOM di un documento viene caricato, gli eventi non sono stringhe di più, sono funzioni.

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

Pertanto non c'è ragione per la conversione di una funzione a una stringa solo così si può eval esso.

dare la vostra forma di un id.

quindi

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

Se sei il caricamento di Javascript in un div via innerHTML, non correre...cordiali saluti.

Se è necessario utilizzare il trasporto Ferroviario built-in Javascript generazione, vorrei utilizzare Orione soluzione, ma con una piccola modifica compensare il codice di ritorno.

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

Tuttavia, a mio parere, si avrebbe un tempo più facile nel lungo periodo, separando il codice Javascript in un file esterno o separato callable funzioni.

Non.

Si dispone di una soluzione.

Stop, passare al prossimo punto della funzione.

Lo so, non è bello, ma ci sono problemi più grandi.

Se non sei sicuro di avere una risposta ancora non lo è, ma in onclick la funzione di selezionare, chiamata onsubmit invece di submit.

In teoria, qualcosa di simile eval ('function(){' + code + '}()'); potrebbe funzionare (che la sintassi non riesce però).Anche se ha fatto il lavoro, sarebbe comunque una sorta di ghetto per essere chiamata di un eval attraverso una selezione onchange.Un'altra soluzione sarebbe quella di ottenere in qualche modo Rotaie per iniettare il onsubmit codice onchange campo del tag select, ma non sono sicuro se c'è un modo per farlo.ActionView ha link_to_remote, ma non c'è alcun evidente helper per generare lo stesso codice in onchange campo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top