2011-01-05 18 views
16

Ho un modulo con diversi elementi e due pulsanti di invio, uno è "Salva", l'altro è "Elimina". Sul pulsante "Elimina" sto usando la finestra di dialogo jQuery per confermare che l'utente vuole eliminare. Quindi se confermano, invio il modulo. Il problema è jQuery.submit() non include il pulsante di invio originale quando viene pubblicato, quindi non posso distinguere sul server un Elimina da un salvataggio poiché entrambi utilizzano lo stesso modulo. Se rimuovo la finestra di dialogo jQuery, il valore del pulsante di invio viene pubblicato come previsto. Questo deve essere molto comune e spero che qualcuno possa condividere una soluzione. Ho cercato in giro e non riesco a trovare nulla di utile (è solo a me o è Google succhiando ultimamente?)jQuery submit() non include il pulsante inviato

Grazie per qualsiasi aiuto ...

EDIT:

L'presentare pulsanti avere nomi e valori impostati. Funziona bene se non usi jQuery.submit()

+0

Incorporare ID sui pulsanti di invio per distinguere tra Salva/Elimina nei controlli jQuery/lato server – benhowdle89

+0

Grazie, ma non è questo il problema. Ho dei valori per i pulsanti di invio. Funziona bene quando non uso jquery.submit(). –

+1

Anche questo problema esiste con il metodo 'serialize()', nonostante i pulsanti di invio abbiano tutti gli attributi solitamente impostati, non verranno riconosciuti. Ho dovuto gestirli manualmente. –

risposta

14

In base alla risposta di karim79:

$("input[type=submit], input[type=button], button").click(function(e) { 
    var self= $(this), 
     form = self.closest(form), 
     tempElement = $("<input type='hidden'/>"); 

    // clone the important parts of the button used to submit the form. 
    tempElement 
     .attr("name", this.name) 
     .val(self.val()) 
     .appendTo(form); 

    // boom shakalaka! 
    form.submit(); 

    // we don't want our temp element cluttering up the DOM, do we? 
    tempElement.remove(); 

    // prevent default since we are already submitting the button's form. 
    e.preventDefault(); 
}); 

UPDATE:

ho appena realizzato il codice di cui sopra non è probabilmente quello che stai cercando:

Se siete c Alling presentare sull'elemento form stesso ($("form").submit();) avrete bisogno di qualcosa di simile:

$("form").submit(function(){ 
    var form = $(this); 
    $("input[type=submit], input[type=button], button", form).eq(0).each(function(){ 
     var self= $(this), 
      tempElement = $("<input type='hidden'/>"); 

     // clone the important parts of the button used to submit the form. 
     tempElement 
      .attr("name", this.name) 
      .val(self.val()) 
      .appendTo(form); 
    }); 
}); 

che aggiungerà nome e il valore del primo elemento pulsante per il DOM destra prima il modulo viene inviato (non sono sicuro di ciò che è il comportamento predefinito del browser qui). Si noti che ciò non rimuove il tempElement dal DOM. Se c'è un errore e il modulo non viene inviato, l'elemento rimarrà e avrai problemi se non ti prendi cura di questo.

+0

Sembra buono, farò un tentativo. Apprezza l'aiuto ... a volte le cose più facili ... –

+0

puoi fare un request.getParameter() sul lato server per ottenere i valori del pulsante – devdar

+1

'submit 'di jQuery non include i valori dei pulsanti. –

1

Questo genere di cose può essere risolto incorporando un parametro 'azione' in qualche modo, che indica al server qual è lo scopo della sottomissione. Per esempio, supponendo che il modulo viene inviato tramite GET:

$("form :input").click(function() { 
    var $form = $(this).closest("form"); 
    var submitTo = $form.attr("action") + '?action=' + $(this).val(); 
    alert(submitTo); 
    // window.location.href = submitTo; 
    return false; 
}); 

http://jsfiddle.net/karim79/JT3GV/5/

+0

Sto inviando per posta. È importante? –

+3

Perché non aggiungere un elemento di input nascosto con lo stesso 'name' del pulsante di input" cliccato "subito prima dell'invio del modulo? Quindi rimuovere l'input nascosto dopo che è stato inviato. In questo modo il modulo funzionerà allo stesso modo per invii non js e js e funzionerà allo stesso modo quando si utilizza GET o POST. –

+0

@David Murdoch - Buon suggerimento. Inizialmente ho iniziato a postare qualcosa su queste linee: ho deciso di fornire un semplice esempio per dimostrare che è possibile utilizzare un parametro aggiuntivo, senza entrare troppo nei dettagli. – karim79

3

Il inviare i dati tasto viene inviato solo se viene cliccato. Quindi non saresti più fortunato se qualcuno avesse premuto invio invece di cliccare sul pulsante di invio.

Si consiglia vivamente di rimuovere il pulsante di cancellazione dal modulo, in quanto probabilmente non servirà comunque la maggior parte delle informazioni del modulo (solo l'ID del record di dati che si desidera eliminare), modificarlo in un pulsante (con type="button") che invia un modulo diverso o, se è possibile, inserire un collegamento lì. (Questo si collega a una pagina di eliminazione, perché rimuove l'attenzione dall'opzione di eliminazione e riduce il rischio che gli utenti accidentalmente facciano clic sul pulsante Elimina.)

+0

buone idee. Ho provato ad utilizzare la diversa forma gestendo il clic e inviando moduli diversi, ma ho riscontrato alcuni problemi nel tentativo di renderlo generalizzato. Dal momento che ho una finestra di dialogo, stavo usando (this) .closest ("form"), quindi l'invio. Funzionava alla grande se il pulsante era contenuto nella sua stessa forma. Ma una volta incluso nel modulo standard non ha funzionato in quanto stava presentando la forma sbagliata. Ri: mettere l'eliminazione su una pagina diversa. Questo ha senso per me, ma in questo caso gli utenti non lo faranno. Vogliono evitare un ulteriore passo. –

+0

Non sto suggerendo che dovresti avere la funzione di cancellazione su una pagina diversa. Puoi e dovresti averlo sulla stessa pagina, appena fuori dal modulo, o usando un link (che reindirizza l'utente a una pagina che esegue l'eliminazione). Qual'era il tuo problema con la "generalizzazione"? (Non sono sicuro di capire cosa intendi con questo.) – Sebastian

+0

Intendo dire che ho una posizione centralizzata che gestisce la conferma dell'eliminazione e quindi l'invio del modulo. Quindi in un file general.js collego l'evento click per i pulsanti che hanno una classe deleteConfirmation. Ho spostato il pulsante nella sua stessa forma e sto cercando di usare il CSS per allinearlo accanto agli altri pulsanti –

Problemi correlati