Envíe un formulario usando jQuery [cerrado]

476

Quiero enviar un formulario usando jQuery. ¿Alguien puede proporcionar el código, una demostración o un enlace de ejemplo?

mehul
fuente

Respuestas:

482

Depende de si está enviando el formulario normalmente o mediante una llamada AJAX. Puede encontrar mucha información en jquery.com , incluida documentación con ejemplos. Para enviar un formulario normalmente, consulte el submit()método en ese sitio. Para AJAX , hay muchas posibilidades diferentes, aunque probablemente desee usar los métodos ajax()o post(). Tenga en cuenta que post()es realmente una forma conveniente de llamar al ajax()método con una interfaz simplificada y limitada.

Un recurso crítico, uno que uso todos los días, que debe marcar como favorito es Cómo funciona jQuery . Tiene tutoriales sobre el uso de jQuery y la navegación de la izquierda da acceso a toda la documentación.

Ejemplos:

Normal

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

Tenga en cuenta que los métodos ajax()y post()anteriores son equivalentes. Hay parámetros adicionales que puede agregar a la ajax()solicitud para manejar errores, etc.

tvanfosson
fuente
3
Me faltaba el método de serialización. Obviamente, miré en jQuery.com, pero sus documentos sobre $.postdeconstruyen y reconstruyen explícitamente el formulario para generar datos para enviar. ¡Gracias!
nomen
1
si tengo algunos datos listos que quiero agregar a la solicitud de publicación (no ajax, formulario enviar solicitud de publicación) antes de enviar, ¿cómo hago eso?
ア レ ッ ク ス
1
@AlexanderSupertramp: en el ejemplo anterior, los datos se envían como parámetros de formulario codificados en url. Simplemente puede agregar los datos como parámetros de formulario adicionales. $('form#MyForm').serialize() + '&newData=' + newData + '&moreData=' + moreData. Nota: los dos últimos pueden necesitar ser codificados en URL usando encodeURIComponent(). O bien, podría cambiar para usar la codificación JSON en ambos extremos, pero luego necesitaría colocar los datos del formulario en una estructura de datos JavaScript con sus datos adicionales y serializarlos. En ese caso, probablemente usaría serializeArrayen el formulario y combinaría sus otros datos.
tvanfosson
"Espero una respuesta json" resolvió un problema diferente para mí (re: fallan las llamadas a Flask).
scharfmn
Si tiene un botón de envío llamado 'enviar', esto fallará silenciosamente (jQuery) o producirá un error que dice "enviar no es una función" (vanilla js). Cambiar el nombre del botón a cualquier otra cosa se resolverá . ¯_ (ツ) _ / ¯ 🤷
fzzylogic
122

Tendrás que usar $("#formId").submit().

Generalmente llamarías a esto desde una función.

Por ejemplo:

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

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

Puede obtener más información sobre esto en el sitio web de Jquery .

Draco
fuente
55
Si usa jQuery, ¿por qué usaría un atributo onclick en línea?
nnnnnn
3
@BradleyFlood - ¿Cómo debería haberlo hecho en su lugar? ¿A los novatos como nosotros les gustaría saber?
MarcoZen
2
@MarcoZen Creo que BradleyFlood estaba señalando que la frase "Por ejemplo:" significa que usar el atributo onclick en línea es solo una de varias formas posibles. De hecho, más jQuery-like estaría usando .on ('click', submitDetailsForm).
Jan Kukacka
@ JanKukacka - Notado Gracias.
MarcoZen
71

cuando tiene un formulario existente, que ahora debería funcionar con jquery - ajax / post ahora podría:

  • colgar en el envío - evento de su formulario
  • evitar la funcionalidad predeterminada de enviar
  • haz tus propias cosas

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

Tenga en cuenta que, para que la serialize()función funcione en el ejemplo anterior, todos los elementos del formulario deben tener su nameatributo definido.

Ejemplo de la forma:

<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: los datos se envían utilizando POST en esta muestra, por lo que esto significa que puede acceder a sus datos a través de

 $_POST['dataproperty1'] 

, donde dataproperty1 es un "nombre-variable" en su json.

aquí muestra la sintaxis si usa CodeIgniter:

 $pdata = $this->input->post();
 $prop1 = $pdata['prop1'];
 $prop1 = $pdata['prop2'];
womd
fuente
¿Por qué está reutilizando el selector del formulario, por qué no reutiliza el elemento del formulario en sí?
Slava Fomin II
sí, también puede hacer esto: <form id = "myform" onsubmit = "do_stuff ()">, pero si el js se carga más tarde / anulado, esa función puede no estar disponible ... así que pensé en inicializar esto en el documento. listo ... no estoy seguro de si estoy en el mismo pensamiento, ¿puedes ilustrar lo que estabas haciendo?
womd
1
Gracias por resaltar que el atributo "nombre" debe estar definido
ccalboni
1
DataType: 'application / json' es un error. Debería leer dataType: 'json'. Obtendrá errores de análisis si se deja como en el ejemplo anterior.
Hankster
@Hankster sí, era json pero fue editado ... Hollander, ¿puedes verificar / confirmar?
womd
68

En jQuery preferiría lo siguiente:

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

Pero, de nuevo, realmente no necesita jQuery para realizar esa tarea, solo use JavaScript normal:

document.getElementById("form-id").submit()
Gernberg
fuente
1
@windmaomao ¿incluiste jQuery en tu página web? Sin embargo, es posible que necesite usar jQuery en lugar de $ aswell. Recomiendo usar la solución JS normal a menos que ya tenga incluido jQuery.
gernberg
1
@windmaomao Tuve el mismo problema. Mi jQuery ejecutó todas las demás funciones, pero no envió el formulario. Funcionó simplemente usando el método document.getElementById.
Desafío
41

Del manual: jQuery Doc

$("form:first").submit();
AdamSane
fuente
3
Es difícil enviar el formulario por "id" que encontrar el primer formulario y enviarlo. Sin embargo, funcionará perfectamente si solo hay un formulario a la vez.
Chintan Thummar
22

Para información
si alguien usa

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

No hagas algo como esto

<button name = "submit">

Me llevó muchas horas encontrar que submit () no funcionaría así.

AZ suave
fuente
1
El "sumit"error tipográfico en la palabra clave no aclara si el error tipográfico no tiene respuesta en la respuesta o si está relacionado con el problema. ¿Quiere decir que un botón llamado "submit"desordena jquery form submit ()? ¿O quiere decir que el problema fue que le dio el nombre del botón enviar en lugar del estándar type="submit"?
Daryn
Mi intención no era responder a esta pregunta, sino decirles a quienes enfrentaron este problema. Creo que el problema es con el nombre del botón sin tipo definido, porque usé el evento onclick para verificar alguna entrada antes de enviarla. Si type = submit, envíe el formulario sin que se active mi evento onclick.
AZ Soft
16

Úselo para enviar su formulario usando jquery. Aquí está el enlace 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>
Chintan Thummar
fuente
2
Aunque esta es una publicación antigua, vale la pena agregar un tipo buttona su botón para asegurarse de que el formulario no se envíe (ya que no todos los navegadores tratan los botones sin tipos de la misma manera).
Mikey
@ Mikey Gracias por la sugerencia.
Chintan Thummar el
14

esto enviará un formulario con preloader:

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

Tengo un truco para hacer una publicación de datos de formulario reformada con un método aleatorio http://www.jackart4.com/article.html

jacky
fuente
¿podrías publicar el enlace actualizado? El enlace de arriba ya no funciona.
Chris22
12

Tenga en cuenta que si ya instaló un detector de eventos de envío para su formulario, la llamada interna para enviar ()

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

no funcionará ya que intenta instalar un nuevo detector de eventos para el evento de envío de este formulario (que falla). Por lo tanto, debe acceder al elemento HTML en sí (desenvolver de jQquery) y llamar a submit () en este elemento directamente:

    jQuery('#<form-id>').submit( function(e){ 
      e.preventDefault();
      // note the [0] array access:
      if ( <form-is-valid> ) jQuery('#<form-id>')[0].submit();
    });
gutschilla
fuente
7
jQuery("a[id=atag]").click( function(){

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

            **OR**

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

Tenga en cuenta que en Internet Explorer hay problemas con los formularios creados dinámicamente. Un formulario creado como este no se enviará en IE (9):

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

Para que funcione en IE, cree el elemento de formulario y adjúntelo antes de enviarlo así:

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);

Crear el formulario como en el ejemplo 1 y luego adjuntarlo no funcionará: en IE9 arroja un error JScript DOM Exception: HIERARCHY_REQUEST_ERR (3)

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

Nenotlep
fuente
7

Las soluciones hasta ahora requieren que conozca la ID del formulario.

Use este código para enviar el formulario sin necesidad de conocer la ID:

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

Por ejemplo, si desea manejar el evento de clic para un botón, puede usar

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

Si el botón se encuentra entre las etiquetas de formulario, prefiero esta versión:

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

podrías usarlo así:

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

O

document.formName.submit();
Ram Ch. Bachkheti
fuente
4

Truco de IE para formas dinámicas:

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

Mi enfoque es ligeramente diferente Cambie el botón en el botón Enviar y luego haga clic

$("#submit").click(function(event) {
$(this).attr('type','submit');
$(this).click();
});
NaveenDA
fuente
2
function  form_submit(form_id,filename){
    $.post(filename,$("#"+form_id).serialize(), function(data){
        alert(data);
    });
}

Publicará los datos del formulario en su nombre de archivo a través de AJAX.

kdniazi
fuente
1

Recomiendo una solución genérica para que no tenga que agregar el código para cada formulario. Use el complemento de formulario jquery (http://jquery.malsup.com/form/) y agregue este código.

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

});
danidacar
fuente
1

podrías hacerlo así:

$('#myform').bind('submit', function(){ ... });
vdegenne
fuente
-2

También he usado lo siguiente para enviar un formulario (sin enviarlo realmente) a través de Ajax:

  jQuery.get("process_form.php"+$("#form_id").serialize(), {}, 
    function() {
      alert("Okay!"); 
    });
Brian Newman
fuente
3
Esto no es nada como un submit (). por una cosa submit () usa semántica POST, estás usando un GET
Scott Evernden