Invia un modulo utilizzando jQuery [chiuso]


476

Voglio inviare un modulo utilizzando jQuery. Qualcuno può fornire il codice, una demo o un link di esempio?

Risposte:


482

Dipende se si sta inviando il modulo normalmente o tramite una chiamata AJAX. Puoi trovare molte informazioni su jquery.com , inclusa la documentazione con esempi. Per inviare un modulo normalmente, controlla il submit()metodo su quel sito. Per AJAX , ci sono molte diverse possibilità, anche se probabilmente si desidera utilizzare il metodo ajax()o post(). Si noti che post()è davvero solo un modo conveniente per chiamare il ajax()metodo con un'interfaccia semplificata e limitata.

Una risorsa fondamentale, una che uso ogni giorno, che dovresti aggiungere ai segnalibri è Come funziona jQuery . Ha tutorial sull'uso di jQuery e la navigazione a sinistra dà accesso a tutta la documentazione.

Esempi:

Normale

$('form#myForm').submit();

AJAX

$('input#submitButton').click( function() {
    $.post( 'some-url', $('form#myForm').serialize(), function(data) {
         // ... do something with response from server
       },
       'json' // I expect a JSON response
    );
});

$('input#submitButton').click( function() {
    $.ajax({
        url: 'some-url',
        type: 'post',
        dataType: 'json',
        data: $('form#myForm').serialize(),
        success: function(data) {
                   // ... do something with the data...
                 }
    });
});

Si noti che i metodi ajax()e post()sopra sono equivalenti. Ci sono parametri aggiuntivi che puoi aggiungere alla ajax()richiesta per gestire errori, ecc.


3
Mi mancava il metodo serialize. Ovviamente, ho guardato jQuery.com, ma i loro documenti su $.postesplicitamente decostruiscono e ricostruiscono il modulo per generare dati da inviare. Grazie!
nomen

1
se ho alcuni dati pronti da aggiungere alla richiesta di post (non ajax, modulo invia richiesta di post) prima di inviare, come posso farlo?
ア レ ッ ク ス

1
@AlexanderSupertramp: nell'esempio sopra i dati vengono inviati come parametri del modulo con codifica URL. È possibile semplicemente aggiungere i dati come parametri di modulo aggiuntivi. $('form#MyForm').serialize() + '&newData=' + newData + '&moreData=' + moreData. Nota: potrebbe essere necessario codificare l'URL utilizzando questi ultimi due encodeURIComponent(). OPPURE - potresti cambiare per utilizzare la codifica JSON su entrambe le estremità, ma dovrai inserire i dati del modulo in una struttura di dati JavaScript con i tuoi dati extra e serializzarli. In tal caso probabilmente serializeArray
useresti

"Mi aspetto una risposta json" risolto un problema diverso per me (ri: le chiamate a Flask falliscono).
scharfmn,

Se si dispone di un pulsante di invio denominato "submit", ciò fallirà tranquillamente (jQuery) o genererà un errore che dice "submit non è una funzione" (vanilla js). La ridenominazione del pulsante per qualsiasi altra cosa si risolverà . ¯_ (ツ) _ / ¯ 🤷
fzzylogic

122

Si dovrà utilizzare $("#formId").submit().

Generalmente lo chiameresti all'interno di una funzione.

Per esempio:

<input type='button' value='Submit form' onClick='submitDetailsForm()' />

<script language="javascript" type="text/javascript">
    function submitDetailsForm() {
       $("#formId").submit();
    }
</script>

Puoi ottenere maggiori informazioni al riguardo sul sito Web di Jquery .


55
Se stai usando jQuery perché dovresti usare un attributo onclick in linea?
nnnnnn,

3
@BradleyFlood - Come avrebbe dovuto farlo invece? I neofiti come noi vorrebbero sapere?
MarcoZen,

2
@MarcoZen Penso che BradleyFlood stesse sottolineando che la frase "Ad esempio:" significa che l'uso dell'attributo onclick inline è solo uno dei tanti modi possibili. In effetti, più jQuery avrebbe usato .on ('click', submitDetailsForm).
Jan Kukacka,

@JanKukacka - Notato. Grazie.
MarcoZen,

71

quando hai un modulo esistente, che ora dovrebbe funzionare con jquery - ajax / post ora potresti:

  • resisti all'invio - evento del modulo
  • impedire la funzionalità predefinita di invio
  • fai le tue cose

    $(function() {
        //hang on event of form with id=myform
        $("#myform").submit(function(e) {
    
            //prevent Default functionality
            e.preventDefault();
    
            //get the action-url of the form
            var actionurl = e.currentTarget.action;
    
            //do your own request an handle the results
            $.ajax({
                    url: actionurl,
                    type: 'post',
                    dataType: 'application/json',
                    data: $("#myform").serialize(),
                    success: function(data) {
                        ... do something with the data...
                    }
            });
    
        });
    
    });
    

Si noti che, affinché la serialize()funzione funzioni nell'esempio precedente, tutti gli elementi del modulo devono avere il loro nameattributo definito.

Esempio di modulo:

<form id="myform" method="post" action="http://example.com/do_recieve_request">

<input type="text" size="20" value="default value" name="my_input_field">
..
.
</form>

@PtF: i dati vengono inviati utilizzando POST in questo esempio, quindi ciò significa che è possibile accedere ai dati tramite

 $_POST['dataproperty1'] 

, dove dataproperty1 è un "nome-variabile" nel tuo json.

qui la sintassi di esempio se si utilizza CodeIgniter:

 $pdata = $this->input->post();
 $prop1 = $pdata['prop1'];
 $prop1 = $pdata['prop2'];

Perché stai riutilizzando il selettore del modulo, perché non riutilizzare l'elemento del modulo stesso?
Slava Fomin II,

sì, potresti fare anche questo: <form id = "myform" onsubmit = "do_stuff ()">, ma se js viene caricato in seguito / rinviato quella funzione potrebbe non essere disponibile .. quindi ho pensato di inizializzarlo sul documento. pronto .... non sono sicuro che io abbia lo stesso pensiero, puoi illustrarmi cosa stai facendo?
womd

1
Grazie per aver evidenziato che l'attributo "nome" deve essere definito
ccalboni,

1
DataType: 'application / json' è un errore. Dovrebbe leggere dataType: 'json'. Riceverai errori di analisi se lasciato come nell'esempio sopra.
Hankster,

@Hankster sì, era JSON ma è stato modificato ... Hollander puoi controllare / confermare?
womd

68

In jQuery preferirei quanto segue:

$("#form-id").submit()

Ma ancora una volta, non hai davvero bisogno di jQuery per eseguire questa attività - basta usare JavaScript normale:

document.getElementById("form-id").submit()

1
@windmaomao hai incluso jQuery nella tua pagina web? È possibile che sia necessario utilizzare jQuery anche a $, tuttavia - ti consiglio di utilizzare la normale soluzione JS a meno che tu non abbia già incluso jQuery.
gernberg,

1
@windmaomao Ho avuto lo stesso problema. My jQuery ha eseguito tutte le altre funzioni, ma non ha inviato il modulo. Ha funzionato semplicemente usando il metodo document.getElementById.
Sfida

41

Dal manuale: jQuery Doc

$("form:first").submit();

3
E 'più complicato inviare il modulo per "id" piuttosto che trovare il primo modulo e inviarlo, tuttavia funzionerà perfettamente se esiste un solo modulo alla volta.
Chintan Thummar,

22

Per informazioni
se qualcuno lo utilizza

$('#formId').submit();

Non fare qualcosa del genere

<button name = "submit">

Ci sono volute molte ore per scoprire che submit () non funzionerà in questo modo.


1
L' "sumit"errore di battitura sulla parola chiave rende poco chiaro se l'errore di battitura non è intenzionale nella risposta o era correlato al problema. Vuoi dire che un pulsante chiamato "submit"rovina jquery form submit ()? O vuoi dire che il problema era che hai dato il nome del pulsante di invio anziché lo standard type="submit"?
Daryn,

la mia intenzione non era quella di rispondere a questa domanda, ma di dire a coloro che hanno affrontato questo problema. Penso che il problema sia con il nome del pulsante senza il tipo definito, perché ho usato l'evento onclick per controllare alcuni input prima dell'invio. Se type = submit, allora invia form senza il mio evento di attivazione onclick.
AZ Soft

16

Usalo per inviare il modulo utilizzando jquery. Ecco il link http://api.jquery.com/submit/

<form id="form" method="post" action="#">
    <input type="text" id="input">
    <input type="button" id="button" value="Submit">
</form>

<script type="text/javascript">
$(document).ready(function () {
    $( "#button" ).click(function() {
        $( "#form" ).submit();
    });
});
</script>

2
Sebbene si tratti di un vecchio post, vale la pena aggiungere un tipo buttonal pulsante per assicurarsi che il modulo non venga inviato (poiché non tutti i browser trattano i pulsanti senza tipi nello stesso modo).
Mikey,

@Mikey Grazie per il suggerimento.
Chintan Thummar,

14

questo invierà un modulo con il preloader:

var a=$('#yourform').serialize();
$.ajax({
    type:'post',
    url:'receiver url',
    data:a,
    beforeSend:function(){
        launchpreloader();
    },
    complete:function(){
        stopPreloader();
    },
    success:function(result){
         alert(result);
    }
});

ho qualche trucco per rendere un post dei dati del modulo riformato con metodo casuale http://www.jackart4.com/article.html


potresti pubblicare il link aggiornato? Il link sopra non funziona più.
Chris22


12

Tieni presente che se hai già installato un listener di eventi di invio per il tuo modulo, l'inner call to submit ()

jQuery('#<form-id>').submit( function(e){ 
    e.preventDefault();
    // maybe some validation in here
    if ( <form-is-valid> ) jQuery('#<form-id>').submit();
});

non funzionerà nel tentativo di installare un nuovo listener di eventi per l'evento di invio di questo modulo (che non riesce). Quindi devi accedere all'elemento HTML stesso (scartalo da jQquery) e chiamare submit () su questo elemento direttamente:

    jQuery('#<form-id>').submit( function(e){ 
      e.preventDefault();
      // note the [0] array access:
      if ( <form-is-valid> ) jQuery('#<form-id>')[0].submit();
    });


7
jQuery("a[id=atag]").click( function(){

    jQuery('#form-id').submit();      

            **OR**

    jQuery(this).parents("#form-id").submit();
});

7

Si noti che in Internet Explorer ci sono problemi con i moduli creati dinamicamente. Un modulo creato in questo modo non verrà inviato in IE (9):

var form = $('<form method="post" action="/test/Delete/">' +
             '<input type="hidden" name="id" value="' + myid + '"></form>');
$(form).submit();

Per farlo funzionare in IE, crea l'elemento del modulo e allegalo prima di inviarlo in questo modo:

var form = document.createElement("form");
$(form).attr("action", "/test/Delete")
       .attr("method", "post");
$(form).html('<input type="hidden" name="id" value="' + myid + '" />');
document.body.appendChild(form);
$(form).submit();
document.body.removeChild(form);

Creare il modulo come nell'esempio 1 e quindi collegarlo non funzionerà: in IE9 genera un errore JScript DOM Exception: HIERARCHY_REQUEST_ERR (3)

Props to Tommy W @ https://stackoverflow.com/a/6694054/694325


7

Le soluzioni finora richiedono di conoscere l'ID del modulo.

Usa questo codice per inviare il modulo senza conoscere l'ID:

function handleForm(field) {
    $(field).closest("form").submit();
}

Ad esempio, se si desidera gestire l'evento click per un pulsante, è possibile utilizzare

$("#buttonID").click(function() {
    handleForm(this);    
});

6

Se il pulsante si trova tra i tag del modulo, preferisco questa versione:

$('.my-button').click(function (event) {
    var $target = $( event.target );
    $target.closest("form").submit();
});


4

IE trucco per forme dinamiche:

$('#someform').find('input,select,textarea').serialize();

3

Il mio approccio è leggermente diverso Cambia il pulsante nel pulsante di invio e poi fai clic

$("#submit").click(function(event) {
$(this).attr('type','submit');
$(this).click();
});

2
function  form_submit(form_id,filename){
    $.post(filename,$("#"+form_id).serialize(), function(data){
        alert(data);
    });
}

Pubblicherà i dati del modulo sul tuo nome file specificato tramite AJAX.


1

Raccomando una soluzione generica in modo da non dover aggiungere il codice per ogni modulo. Utilizzare il plug-in del modulo jquery (http://jquery.malsup.com/form/) e aggiungere questo codice.

$(function(){
$('form.ajax_submit').submit(function() {
    $(this).ajaxSubmit();
            //validation and other stuff
        return false; 
});

});

1

potresti farlo in questo modo:

$('#myform').bind('submit', function(){ ... });

-2

Ho anche usato quanto segue per inviare un modulo (senza effettivamente inviarlo) tramite Ajax:

  jQuery.get("process_form.php"+$("#form_id").serialize(), {}, 
    function() {
      alert("Okay!"); 
    });

3
questo non è niente come un submit (). per una cosa submit () usa la semantica POST, stai usando un GET
Scott Evernden
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.