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.
https://[my-server]/my-controller/my-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.
https://[my-server]/my-controller/my-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.