2011-05-11 7 views
6

En mi formulario, tengo dos botones para enviar.Descubre qué botón de formulario activó el envío

<input type="submit" name="save" value="Save as draft"/> 
<input type="submit" name="send" value="Start sending" /> 

Ahora, antes de enviar el formulario de vuelta al servidor, que desea llevar a cabo tareas específicas en función de lo que se hizo clic en el botón.

$('form').submit(function(){ 
    if submit equals save 
     task 1; 
    elseif submit equals send 
     task 2    
} 

¿Cómo verifico qué botón se presionó?

+3

Estoy seguro de que se puede mejorar en el título de esta pregunta. –

+2

agregue manejadores de clics para los dos botones – user489872

+1

oh bien, hecho .. – goh

Respuesta

5
$(":submit").click(function() { 
    $("form").data("submit-button", this.name); 
}); 

$("form").submit(function() { 
    var button = $(this).data("submit-button"); 
    ... 
}); 

Agregue un controlador de clic en sus botones de envío que almacena el nombre. Luego extrae ese nombre en tu controlador de envío.

+0

Sí, puedes. [violín] (http://jsfiddle.net/9KdQh/) – Raynos

+0

Oh, espera, pensé que simplemente estabas copiando el nombre del botón, el elemento del botón en sí, no a la forma. Pero incluso entonces: ¿por qué no poner la lógica en el controlador de clics, en lugar del manejador de envío del formulario? –

+2

@MarcelKorpel Porque entonces la lógica no se ejecuta cuando envía el formulario a través de otros métodos como presionar ENTER. – Raynos

-1
$('input').each(function(n) { 
    $(this).click(function() { 
    var name = $(this).attr('name'); 

    if (name === 'save') { 
     // do stuff 
    }else if (name === 'submit'){ 
     // do some other stuff 
    } 
    } 
}); 

por supuesto, también puede utilizar una declaración de interruptor.

Si el trabajo que se quiere realizar es compleja y diferente manera, usted debe considerar el uso de 2 formas diferentes

espero que esto responda a su pregunta

EDIT:

$('input:submit').click(function(n) { 
    var name = $(this).attr('name'); 
    if (name === 'save') { 
     // do stuff 
    }else if (name === 'submit'){ 
     // do some other stuff 
    } 
    } 
}); 
+4

¿Dónde se comprueba que se hizo clic en el botón? –

+0

gracias, salté esa parte: 0 – Ibu

+1

Ahora está agregando controladores de eventos a _ todas_ 'entradas', incluso si no va a hacer nada. Parece un poco derrochador. –

5

Si fuera yo, haría esto de una manera un poco diferente. Me gustaría hacer algo en la línea de -

<button type='button' id='formSave'>Save as draft</button> 
<button type='button' id='formSend'>Start Sending</button> 

$('#formSave').click(function(){ 
    //submit form 
    //task 1 
}); 

$('#formSend').click(function(){ 
    //submit form 
    //task 2 
}); 

Im sólo basando mi respuesta fuera de sus nombres de los botones y otras cosas, pero parece que usted quiere hacer algo simliar a esto.

+0

Creo que el segundo debería usar ''# formSend'' –

+3

Esto rompe el soporte de JavaScript. Por favor, escribe JavaScript discreto. – Raynos

+1

@Raynos plantea un buen punto. Recuerde también que los formularios pueden enviarse sin presionar botones, como presionar regresar mientras se enfoca un elemento de entrada; algunos navegadores pseudo-clic en el botón más cercano, otros enviarán el formulario sin pseudo-clic en un botón. –

-2

sugiere emplear el enfoque de HurnsMobile, pero si es absolutamente necesario una función para manejar tanto los botones que puede utilizar el objeto de evento jQuery para detectar los botones,

$('form').submit(function(event){ 
    if(event.target.name == 'save') { 
     // do save task 
    } else if (event.target.name == 'send') { 
     // do send task 
    } 
}); 
+2

¿Estás seguro de que funciona? Creo que algunos navegadores configuran 'event.target === form' – Raynos

+0

@Raynos es correcto,' event.target === form' –

Cuestiones relacionadas