La méthode jQuery `submit` ignore POST envoie avec GET. Pourquoi?

J'ai une forme comme celle-ci.

<form id="hiddenForm" method="post" action="/my-controller/my-action/" enctype="multipart/form-data"> <input type="hidden" id="HiddenFormInput" name="HiddenFormInput"> </form> 

Qui est produit par une page Web accessible via https://[my-server]/my-controller/my-action/ , qui est également l'action à laquelle le formulaire indique.

Du côté du serveur, je différencie les requêtes GET et POST . La page est affichée clairement ( GET ) ou certains résultats sont affichés en fonction des valeurs du formulaire ( POST ).

Lorsque j'utilise jQuery pour soumettre le formulaire (je n'emploie pas AJAX ici, simplement en soumettant le formulaire), comme dans cet extrait,

 $("#hiddenForm").submit(); 

Alors jQuery semble soumettre ce formulaire avec GET , bien qu'il soit clairement marqué pour être soumis avec POST . Même une alert($("#hiddenForm").attr("method")); Produit toujours "post" . Toutefois, ce comportement indésirable ne se produit que si la page a été chargée par un GET . Si la page est arrivée par un POST , c'est-à-dire que le formulaire a déjà été soumis au moins une fois, tout fonctionne comme prévu.

Mettre à jour

Le problème était une ancienne ancienne preventDefault() . Le bouton qui a déclenché le soumission avait une fonctionnalité propre. C'était un lien hypertexte. J'ai donc cette chaîne d'actions.

  1. Lien hypertexte vers https://[my-server]/my-controller/my-action/#
  2. Soumettre un formulaire avec l'action https://[my-server]/my-controller/my-action/ .

Bien sûr, cela entraînerait un appel GET sans le formulaire soumis. Une fois que j'étais sur la page https://[my-server]/my-controller/my-action/# le lien hypertexte a perdu sa fonctionnalité. C'est pourquoi le deuxième essai a toujours fonctionné parce que la chaîne d'actions a été réduite à la soumission du formulaire.

  1. Lien hypertexte vers https://[my-server]/my-controller/my-action/# (sans effet car déjà là)
  2. Soumettre un formulaire avec l'action https://[my-server]/my-controller/my-action/ .

Ensuite, cela s'est bien déroulé.

Comme discuté dans les commentaires, il n'y a pas de bug, au moins sur la dernière version de jQuery 2.0.3, on peut tester ceci:

 <html> <head> <script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> <script> $(document).ready(function () { $('#dosubmit').on('click',function(){ $("#hiddenForm").submit(); }); }); </script> </head> <body> <?php // if(count($_GET) > 0) { echo "<textarea style=\"width: 700px; height: 90px;\"> Submitted with method=GET: \$_GET: "; var_dump($_GET); echo "</textarea>"; } if(count($_POST) > 0) { echo "<textarea style=\"width: 700px; height: 90px;\"> Submitted with method=POST: \$_POST: "; var_dump($_POST); echo "</textarea>"; } ?> <form id="hiddenForm" method="post" enctype="multipart/form-data"> <input type="hidden" id="HiddenFormInput" name="HiddenFormInput" /> </form> <div id="dosubmit" style="background-color: gold; width: 200px; cursor: pointer;">Click me to Do jQuery Submit</div> </body> </html> 

Quand on clique sur le texte d'arrière-plan doré, $ ("# hiddenForm"). Submit (); Est utilisé pour soumettre le formulaire.

Voici la sortie:

 Submitted with method=POST: $_POST: array(1) { ["HiddenFormInput"]=> string(0) "" } 

Dans votre forme originale, aucun argument d'URL n'est transmis par la soumission, car seules les entrées avec l'attribut de nom spécifié sont soumises. J'ai donc ajouté le nom de l'attribut = " HiddenFormInput " pour votre entrée cachée.