我有一个这样的表格.
由可通过 https://[my-server]/my-controller/my-action/
访问的网页生成,这也是表单指向的操作.>
在服务器端,我区分了 GET
和 POST
请求.页面显示清晰 (GET
) 或根据表单的值显示某些结果 (POST
).
当我使用 jQuery 提交表单时(我在这里没有使用 AJAX,只是提交表单),如本代码段所示,
$("#hiddenForm").submit();
然后 jQuery 似乎是用 GET
提交这个表单的,尽管它清楚地标记为用 POST
提交.即使是 alert($("#hiddenForm").attr("method"));
也总是产生 "post"
.但是,只有当页面已被 GET
加载时,才会发生这种不需要的行为.如果页面是通过 POST
来的,即表单至少已经提交过一次,那么一切都按预期进行.
更新
问题是一个普通的 preventDefault()
问题.触发提交的按钮有自己的功能.那是一个超链接.所以我有了这个动作链.
https://[my-server]/my-controller/my-action/#
https://[my-server]/my-controller/my-action/
提交表单.当然,这会导致在没有提交表单的情况下调用 GET
.一旦我在页面 https://[my-server]/my-controller/my-action/#
上,超链接失去了它的功能.这就是为什么第二次尝试总是有效的原因,因为操作链减少到提交表单.
https://[my-server]/my-controller/my-action/#
https://[my-server]/my-controller/my-action/
提交表单.然后它当然起作用了.
正如评论中所讨论的,没有错误,至少在 jQuery 2.0.3 的最后一个版本上,可以用这个来测试:
<头><script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script><脚本>$(document).ready(function () {$('#dosubmit').on('click',function(){$("#hiddenForm").submit();});});头部><身体><?php//如果(计数($_GET)> 0){echo "<textarea style="width: 700px;高度:90px;">提交方法=GET:$_GET:";var_dump($_GET);echo "</textarea>";}如果(计数($_POST)> 0){echo "<textarea style="width: 700px;高度:90px;">提交方法=POST:$_POST:";var_dump($_POST);echo "</textarea>";}?><form id="hiddenForm" method="post" enctype="multipart/form-data"><input type="hidden" id="HiddenFormInput" name="HiddenFormInput"/></表单><div id="dosubmit" style="background-color: gold; width: 200px; cursor: pointer;">点击我做jQuery提交</div>