jQuery - aggiungi parametri aggiuntivi al momento dell'invio (NON ajax)


206

Usando "submit" di jQuery - c'è un modo per passare parametri aggiuntivi a un modulo? NON sto cercando di farlo con Ajax - questa è una normale, tipica presentazione di aggiornamento.

$('#submit').click(function () {
    $('#event').submit(function () {
        data: { 
        form['attendees'] = $('#attendance').sortable('toArray').toString();
    });
});

Quale tecnologia lato server stai usando?
Enrique,

Vedi la mia risposta [qui] [1], che si aggiunge a un modulo serializzato prima di inviarlo. [1]: stackoverflow.com/questions/17809056/…
Jeff Lowery,

Risposte:


371

Questo è stato per me:

var input = $("<input>")
               .attr("type", "hidden")
               .attr("name", "mydata").val("bla");
$('#form1').append(input);

si basa sulla risposta di Daff, ma ha aggiunto l'attributo NAME per mostrarlo nella raccolta moduli e ha cambiato VALUE in VAL. Ho anche verificato l'ID del FORM (nel mio caso form1)

utilizzato il firebug di Firefox per verificare se l'elemento è stato inserito.

Gli elementi nascosti vengono registrati nuovamente nella raccolta moduli, vengono scartati solo i campi di sola lettura.

Michel


46
Come posso cantare 'you are my sunshine' in binario? Grazie mille. Questo risolve tante cose.
Ciel,

38
Puoi migliorare leggermente la leggibilità: var input = $ ("<input>", {type: "hidden", nome: "mydata", valore: "bla"}); $ ( '# form1') append ($ (input)).;
Konstantine Kalbazov,

2
$ ("<input>") .attr ("type", "hidden"). attr ("name", "mydata"). val ("bla"). appendTo ('# form1'); è un altro modo
kiev

6
Mi è piaciuta una combinazione di: $ ("<input>", {tipo: "nascosto", nome: "mydata", valore: "bla"}). AppendTo ("# form1");
gabeio,

Non esiste un limite alla dimensione dei dati? Ho inviato alcuni oggetti di grandi dimensioni usando JSON.stringify (obj) e questo metodo e sembrava troncato.
omikron,

26

Nel tuo caso dovrebbe essere sufficiente aggiungere un altro campo nascosto al modulo in modo dinamico.

var input = $("<input>").attr("type", "hidden").val("Bla");
$('#form').append($(input));

I dati che devo inviare non sono idonei al modulo. Deve essere acquisito e gestito sul lato server.
Ciel,

Che cosa intendi con "non capace della forma"?
Vincent Ramdhanie,

Spiacenti, non ha funzionato affatto. Anche con i soli dati forzati, non li inserisce nel modulo.
Ciel,

Non può essere inserito in un campo modulo.
Ciel,

2
Se è una stringa, può essere inserita in un campo modulo
PetersenDidIt

19

Puoi persino usare questo. ha funzionato bene per me

$("#registerform").attr("action", "register.php?btnsubmit=Save") 
$('#registerform').submit();

questo invierà btnsubmit = Salva come valore GET nel modulo register.php.


Questa sembra una soluzione più elegante. Ricorda solo di utilizzare encodeURIComponent()per il valore del parametro in base al tipo di dati.
Andres SK,

1
Questo è effettivamente migliore quando consenti all'utente di inviare il modulo più volte. Il modulo non otterrà più di un campo nascosto con valori diversi.
Mellon,

11

È possibile scrivere una funzione jQuery che consente di aggiungere campi nascosti a un modulo:

// This must be applied to a form (or an object inside a form).
jQuery.fn.addHidden = function (name, value) {
    return this.each(function () {
        var input = $("<input>").attr("type", "hidden").attr("name", name).val(value);
        $(this).append($(input));
    });
};

E quindi aggiungi il campo nascosto prima di inviare:

var frm = $("#form").addHidden('SaveAndReturn', 'Save and Return')
                    .submit();

1
Vedi stackoverflow.com/questions/2601223/… per la versione più avanzata di addHidden
Jonathan

1
Mi piace la semplicità di questa soluzione. Non gestisce molti casi, ma gestisce bene il caso che fa.
Phil

11

Non è necessario associare l'evento di invio al clic del pulsante di invio, basta associare l'evento di invio e acquisirà l'evento di invio non importa come viene attivato.

Pensa che ciò che desideri è inviare il ordinabile come faresti tramite Ajax. Prova a fare qualcosa del genere:

var form = $('#event').submit(function () {
    $.each($('#attendance').sortable('toArray'),function(i, value){
        $("<input>").attr({
            'type':'hidden',
            'name':'attendace['+i+']'
        }).val(value).appendTo(form);
    });
});

ancora non mostrato sul formcollection lato server ... c'è qualcosa di speciale che devo fare per ottenere un campo nascosto da mostrare su un server? Sta attraversando C # / ASP.NET MVC usando un oggetto FormCollection.
Ciel,

Aggiornato la mia risposta, penso di aver capito cosa stai cercando di fare.
PetersenDidIt

Stai aggiungendo un nameattributo all'input del modulo nascosto generato? Come per stackoverflow.com/questions/504681/... sembra che gli oggetti FormCollection richiedono tutti gli <input>elementi per avere i nomi.
npdoty,

Sì, sto cercando di inserire un ordinabile nel formcollection come una stringa di valori separati da virgola. Ho provato il tuo aggiornamento e non viene ancora pubblicato. Non sono sicuro di cosa sto facendo di sbagliato ... Apprezzo l'aiuto.
Ciel,

Sembra che il problema non sia sul lato client ma sul lato server.
PetersenDidIt

2

Risposta simile, ma volevo solo renderlo disponibile per un test facile / veloce.

var input = $("<input>")
               .attr("name", "mydata").val("go Rafa!");

$('#easy_test').append(input);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js"></script>



<form id="easy_test">
  
</form>

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.