Php jquery序列化和$.post
我试图使用jQuery中的$.post方法从表单发送大量数据。我首先使用serialize()函数将所有表单数据生成一个长字符串,然后在服务器端分解。 奇怪的是,当我尝试使用$.post发送它时,它会将serialize()的结果附加到URL,就像我使用GET发送一样。 有人知道为什么会这样吗 以下是jquery:Php jquery序列化和$.post,php,jquery,serialization,post,get,Php,Jquery,Serialization,Post,Get,我试图使用jQuery中的$.post方法从表单发送大量数据。我首先使用serialize()函数将所有表单数据生成一个长字符串,然后在服务器端分解。 奇怪的是,当我尝试使用$.post发送它时,它会将serialize()的结果附加到URL,就像我使用GET发送一样。 有人知道为什么会这样吗 以下是jquery: $("#addShowFormSubmit").click(function(){ var perfTimes = $("#addShowForm").serialize();
$("#addShowFormSubmit").click(function(){
var perfTimes = $("#addShowForm").serialize();
$.post("includes/add_show.php", {name: $("#showTitle").val(), results: perfTimes }, function(data) {
$("#addShowSuccess").empty().slideDown("slow").append(data);
});
});
以下是php:
$show = $_POST['name'];
$results = $_POST['results'];
$perfs = explode("&", $results);
foreach($perfs as $perf) {
$perf_key_values = explode("=", $perf);
$key = urldecode($perf_key_values[0]);
$values = urldecode($perf_key_values[1]);
}
echo $key, $values;
尝试使用serializeArray()而不是serialize()。serialize()将生成一个url编码的查询字符串,而serializeArray()将生成一个JSON数据结构。是什么让您相信数据是附加到url的 无论如何,在表单数据本身中传递表单值不是更有意义吗?它将允许您跳过“分解”步骤:
所以这可能有点迟钝,但我做了一个函数来帮助我做这件事,因为我厌倦了每次都做一大堆修复。serializeArray有点烦人,因为它提供了一个对象集合,而我只想让PhP重构一个关联数组。下面的函数将遍历序列化数组,并仅在存在值时使用适当的属性构建新对象 首先,函数(它采用所讨论表单的ID): 在构建帖子时,我通常也会使用一个对象,因为我通常在表单数据之前标记两个或三个其他值,并且我认为这看起来比内联定义要干净,所以最后一步如下所示:
var payload = new Object();
//stringify requires json2.js from http://www.json.org/js.html
payload.data = JSON.stringify(data);
$.post("page.php", payload,
function(reply) {
//deal with reply.
});
服务器端您所要做的就是$payload=json\u decode($\u POST['data'],true)
,您拥有一个关联数组,其中键是表单字段的名称
完整的免责声明,多个选择可能在这里不起作用,您可能只会得到列表中最后一个值。这也是专门为适合我的一个项目而创建的,所以您可能需要调整它以适合您。例如,我在服务器上的所有回复都使用json。试试这种语法。我使用它来序列化表单,并通过ajax调用来发布WCF服务。此外,您可以将其发送回单个JSON对象,而不是按照您的方式构建对象。试试这个:
var serializedForm = serializedForm = $("#addShowForm").serializeArray();
$.post("includes/add_show.php",
{
"myObjectName": ("#showTitle").val(), results: perfTimes
}, function(data)
{
$("#addShowSuccess").empty()
.slideDown("slow")
.append(JSON.stringify(serializedForm));
});
在php方面,您可能需要研究。如果使用第二个可选参数,它将把url字符串解析为变量或数组。如果使用
元素激活序列化和ajax,并且
元素位于表单
元素内,则按钮将自动充当表单提交,不管其他什么。单击jQuery指定的任务
type='submit'
和
是一回事。如果将表格放在
元素中,他们将提交表格
type='button'
是不同的。它只是一个普通按钮,不会提交表单(除非您有意让它通过JavaScript提交表单)
如果表单元素没有指定action属性,则此提交只是将数据发送回同一页面。因此,您将看到页面刷新,以及URL中出现的序列化数据,就像您在ajax中使用GET一样
可能的解决方案
1-使
键入按钮
。如上所述,这将阻止按钮提交表单
之前:
<form id='myForm'>
<!--Some inputs, selects, textareas, etc here-->
<button id='mySubmitButton'>Submit</button>
</form>
<form id='myForm'>
<!--Some inputs, selects, textareas, etc here-->
<button id='mySubmitButton'>Submit</button>
</form>
显然,没有看到你所有的代码,我不知道你的问题是否如此,但我见过您描述的行为的唯一原因是,提交按钮是一个没有指定类型的
。出现此问题的另一个可能原因是:如果您有一个表单,但没有分配任何类型的提交操作,则在填写表单时只要按“ENTER”键,表单将提交到当前URL,因此您将看到序列化数据出现在URL中,就好像您正在使用GET ajax事务一样。此问题的一个简单解决方案是,在按下ENTER键时阻止其提交表单:
//Prevent Form Submission when Pressing Enter
$("form").bind("keypress", function(e) {
if (e.keyCode == 13)
return false;
});
实际上,真正的诀窍是在click处理程序中调用事件的preventDefault()
方法。这将阻止执行浏览器的本机操作。将按钮保留在表单中,但使用表单的提交处理程序并返回false$('#myForm')。提交(function(){var data=this.serialize();$.post(this.attr('action'),data,function(){alert('done!'});返回false})
将type=“button”
添加到
标记以避免表单提交。它不应该是“&”而不是&?
<form id='myForm'>
<!--Some inputs, selects, textareas, etc here-->
<button type='button' id='mySubmitButton'>Submit</button>
</form>
<form id='myForm'>
<!--Some inputs, selects, textareas, etc here-->
<button id='mySubmitButton'>Submit</button>
</form>
<form id='myForm'>
<!--Some inputs, selects, textareas, etc here-->
</form>
<button id='mySubmitButton'>Submit</button>
$("#addShowFormSubmit").click(function(event){
event.preventDefault();
var perfTimes = $("#addShowForm").serialize();
$.post("includes/add_show.php", {name: $("#showTitle").val(), results: perfTimes }, function(data) {
$("#addShowSuccess").empty().slideDown("slow").append(data);
});
});
//Prevent Form Submission when Pressing Enter
$("form").bind("keypress", function(e) {
if (e.keyCode == 13)
return false;
});