2011-01-05 26 views
16

Tengo un formulario que tiene varios elementos y dos botones de envío, uno es "Guardar" y el otro es "Eliminar". En el botón "Eliminar", estoy usando el cuadro de diálogo jQuery para confirmar que el usuario desea eliminar. Luego, si confirman, envío el formulario. El problema es que jQuery.submit() no incluye el botón de envío original cuando se publica, por lo que no puedo distinguir en el servidor un Eliminar de un Guardar ya que ambos usan el mismo formulario. Si elimino el cuadro de diálogo jQuery, el valor del botón de envío se publica como se espera. Esto TIENE que ser muy común y espero que alguien pueda compartir una solución. He buscado alrededor y no puedo encontrar nada útil (¿Soy yo o está chupando Google últimamente?)jQuery submit() no incluye el botón enviado

Gracias por cualquier ayuda ...

EDIT:

El botones de envío tienen nombres y valores establecidos Funciona bien si no se usa jQuery.submit()

+0

Incorpore ID's en sus botones de envío para distinguir entre Guardar/Eliminar en sus cheques de jQuery/server side – benhowdle89

+0

Gracias, pero ese no es el problema. Tengo valores para los botones de enviar. Funciona bien cuando no uso jquery.submit(). –

+1

Este problema existe con el método 'serialize()' también, a pesar de que los botones de envío tienen todos los atributos usuales establecidos, no serán reconocidos. Tenía que manejarlos manualmente. –

Respuesta

14

Basado en la respuesta de 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(); 
}); 

ACTUALIZACIÓN:

me he dado cuenta de que el código anterior no es probablemente lo que busca:

Si está c Alling presentar en el elemento de forma en sí misma ($("form").submit();) se necesita algo como esto:

$("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); 
    }); 
}); 

que se sumarán nombre y el valor del primero del elemento de botón al DOM justo antes de enviar el formulario (no estoy seguro cuál es el comportamiento predeterminado del navegador aquí). Tenga en cuenta que esto no elimina el tempElement del DOM. Si hay un error y el formulario no se envía, el elemento permanecerá y tendrá problemas si no se ocupa de esto.

+0

Se ve bien, intentaré esto. Apreciar la ayuda ... a veces las cosas más fáciles ... –

+0

puede hacer una request.getParameter() en el lado del servidor para obtener los valores de los botones – devdar

+1

jQuery's 'submit' no incluye los valores de los botones. –

1

Este tipo de cosas se puede resolver incorporando un parámetro de "acción" de alguna manera, que le dice al servidor cuál es el propósito del envío. Por ejemplo, suponiendo que el formulario se envía a través de 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

Estoy enviando por correo. ¿Eso importa? –

+3

¿Por qué no agregar un elemento de entrada oculto con el mismo 'nombre' que el botón de entrada" hecho clic "justo antes de enviar el formulario? A continuación, elimine la entrada oculta después de que se haya enviado. De esta forma, el formulario funcionará de la misma manera para presentaciones que no sean js y js, y funcionará de la misma manera al usar GET o POST. –

+0

@David Murdoch - Buena sugerencia. Inicialmente iba a publicar algo en ese sentido: opté por proporcionar un ejemplo simple para demostrar que se puede usar un parámetro adicional, sin entrar en demasiados detalles. – karim79

3

El presentar datos botón sólo se presenta si se hace clic en. Por lo tanto, tampoco estarías de suerte si alguien presionara Intro en lugar de hacer clic en el botón Enviar.

Recomiendo quitar el botón Eliminar del formulario, ya que probablemente no necesite la mayoría de la información del formulario (solo el ID del registro de datos que desea eliminar), cámbielo a un botón (con type="button") que envía un formulario diferente o, si puede, ponga un enlace allí. (Eso se vincula a una página de eliminación: esto es mejor por motivos de usabilidad de todos modos, porque elimina el foco de la opción de eliminar y reduce el riesgo de que los usuarios hagan clic accidentalmente en el botón Eliminar)

+0

buenas ideas. Intenté ir a la ruta de formulario diferente al hacer clic en el botón y enviar un formulario diferente, pero me encontré con algunos problemas al tratar de generalizarlo. Como tengo un diálogo, estaba usando (this) .closest ("form") y luego enviando. Esto funcionó muy bien si el botón estaba contenido en su propia forma. Pero una vez incluido con el formulario estándar no funcionó ya que estaba enviando el formulario incorrecto. Re: poner eliminar en una página diferente. Eso tiene sentido para mí, pero los usuarios no lo buscarán en este caso. Quieren evitar pasos adicionales. –

+0

No sugiero que deba tener la función de eliminar en una página diferente. Puede y debe tenerlo en la misma página, justo fuera del formulario, o utilizando un enlace (que redirigiría al usuario a una página que realiza la eliminación). ¿Cuál fue tu problema con la "generalización"? (No estoy seguro de entender lo que quieres decir con eso.) – Sebastian

+0

Lo que quiero decir con la generalización es que tengo un lugar centralizado que maneja la confirmación de eliminación y luego envía el formulario. Entonces, en un archivo general.js, conecto el evento click para los botones que tienen una clase deleteConfirmation. Moví el botón en su propia forma y estoy tratando de usar CSS para alinearlo al lado de los otros botones –

Cuestiones relacionadas