Esiste una soluzione jQuery migliore per this.form.submit () ;?
-
03-07-2019 - |
Domanda
Voglio attivare l'evento di invio del modulo in cui si trova l'elemento corrente. Un metodo che conosco a volte funziona è:
this.form.submit();
Mi chiedo se esiste una soluzione migliore, possibilmente usando jQuery, poiché non sono sicuro al 100% che il metodo funzioni in tutti i browser.
Modifica:
La situazione che ho è la seguente:
<form method="get">
<p><label>Field Label
<select onchange="this.form.submit();">
<option value="blah">Blah</option>
....
</select></label>
</p>
</form>
Voglio essere in grado di inviare il modulo in caso di modifica di <select>
.
Quello che sto cercando è una soluzione che funzioni su qualsiasi campo all'interno di qualsiasi modulo senza conoscere l'id o il nome sul modulo. $('form:first')
e $('form')
non funzioneranno perché il modulo potrebbe essere il terzo nella pagina. Inoltre, sto già usando jQuery sul sito, quindi usare un po 'di jQuery non è un grosso problema.
Quindi, c'è un modo per far recuperare a jQuery il modulo in cui si trova l'input / select / textarea?
Soluzione
Penso che quello che stai cercando sia qualcosa del genere:
$(field).closest("form").submit();
Ad esempio, per gestire l'evento onchange, dovresti avere questo:
$(select your fields here).change(function() {
$(this).closest("form").submit();
});
Se, per qualche motivo, non stai utilizzando jQuery 1.3 o versioni successive, puoi chiamare parents
anziché closest
.
Altri suggerimenti
this.form.submit();
Questa è probabilmente la tua scommessa migliore. Soprattutto se non stai già usando jQuery nel tuo progetto, non è necessario aggiungerlo (o qualsiasi altra libreria JS) solo per questo scopo.
Puoi sempre JQuery-ize il tuo form.submit, ma può semplicemente chiamare il stessa cosa:
$("form").submit(); // probably able to affect multiple forms (good or bad)
// or you can address it by ID
$("#yourFormId").submit();
Puoi anche allegare funzioni all'evento di presentazione, ma questo è un concetto diverso.
Simile a Matthew's risposta, ho appena scoperto che puoi fare quanto segue:
$(this).closest('form').submit();
Sbagliato: il problema con l'utilizzo della funzionalità padre è che il campo deve essere immediatamente all'interno del modulo per funzionare (non all'interno di tds, etichette, ecc.)
Sono corretto: anche il genitore s (con una s) funziona. Grazie Paolo per averlo sottolineato.
Ho scoperto che usando jQuery la soluzione migliore è
$(this.form).submit()
L'utilizzo di questa dichiarazione plug-in jquery (ad es. plug-in modulo jquery ) funziona correttamente e l'overhead di attraversamento DOM jquery è ridotto al minimo .
La tua domanda è alquanto confusa in quanto non spieghi cosa intendi con " elemento corrente " ;.
Se hai più moduli in una pagina con tutti i tipi di elementi di input e un pulsante di tipo " submit " ;, quindi premi " inserisci " al momento della compilazione di uno qualsiasi dei suoi campi attiverà l'invio di tale modulo. Non hai bisogno di Javascript lì.
Ma se hai più " submit " pulsanti in un modulo e nessun altro input (es. " modifica riga " e / o " elimina riga " pulsanti nella tabella), quindi la riga che hai pubblicato potrebbe essere la modo di farlo.
Un altro modo (non è necessario Javascript) potrebbe essere quello di fornire valori diversi a tutti i pulsanti (che sono di tipo " submit "). In questo modo:
<form action="...">
<input type="hidden" name="rowId" value="...">
<button type="submit" name="myaction" value="edit">Edit</button>
<button type="submit" name="myaction" value="delete">Delete</button>
</form>
Quando si fa clic su un pulsante, verrà inviato solo il modulo contenente il pulsante e verrà inviato solo il valore del pulsante premuto (insieme ad altri valori di input).
Quindi sul server leggi il valore della variabile " myaction " e decidere cosa fare.
In JQuery puoi chiamare
$("form:first").trigger("submit")
Non so se è molto meglio. Penso form.submit (); è piuttosto universale.
<form method="get">
<p><label>Field Label
<select onchange="this.form.submit();">
<option value="blah">Blah</option>
....
</select>
</label>
</p>
**<!-- <input name="submit" type="submit" /> // name="submit_new_name" -->**
</form>
<!--
this.form.submit == this.form.elements['submit'];
-->