为什么 ajax 有时会对序列化数据进行 urlencode 而有时却不会?
Why does ajax sometimes urlencode serialised data and sometimes it doesnt?
当我使用 ajax 将序列化数据发送到 PHP 文件时,有时会 URL 编码,具体取决于我的操作方式。
最初我有以下代码工作正常:
$.ajax({
type: 'POST',
url: 'ajax-process.php',
data: $("#sitestructure-form").serialize(),
success: function(d){$("#structureupdate").html(d);}
});
数据已发送到我的 PHP 文件,我可以回显它,它看起来像这样。
[{"id":20,"children":[{"id":21}]},{"id":19},{"id":18,"children":[{"id":14}]},{"id":16},{"id":13,"children":[{"id":11}]},{"id":17},{"id":15},{"id":12}]
我想发送不止一条数据,我调用了序列化数据 'order' 并向其添加了 'process' 所以我将我的代码更新为以下内容:
$.ajax({
type: 'POST',
url: 'ajax-process.php',
data: {
order: $("#sitestructure-form").serialize(),
process: "sitemap-reordernavigation"
},
success: function(d){$("#structureupdate").html(d);}
});
然而,当我检索在 'order' 中发送的序列化数据时,输出如下所示:
data=%5B%7B%22id%22%3A20%2C%22children%22%3A%5B%7B%22id%22%3A21%7D%5D%7D%2C%7B%22id%22%3A19%7D%2C%7B%22id%22%3A18%2C%22children%22%3A%5B%7B%22id%22%3A14%7D%5D%7D%2C%7B%22id%22%3A16%7D%2C%7B%22id%22%3A13%2C%22children%22%3A%5B%7B%22id%22%3A11%7D%5D%7D%2C%7B%22id%22%3A17%7D%2C%7B%22id%22%3A15%7D%2C%7B%22id%22%3A12%7D%5D
我能想到的解决这个问题的唯一方法是使用php对其进行urldecode,然后使用str_replace删除前面的'data='位,就像这样.
$data = str_replace("data=","",urldecode($_POST['order']));
我怎样才能让它与 AJAX 一起工作,这样我就不必对它进行 urldecode 了?
我试过使用变量并将 processData 设置为 false,但这似乎不起作用。
var order = $("#sitestructure-form").serialize();
$.ajax({
type: 'POST',
url: 'ajax-process.php',
processData: false,
data: {
order: order,
process: "sitemap-reordernavigation"
},
success: function(d){$("#structureupdate").html(d);}
});
我对 AJAX/Jquery 的了解相当有限,如有任何帮助,我们将不胜感激。
那是因为您第一次将序列化文本字符串提供给数据属性并且 jQuery 没有将其转换为序列化字符串。第二个是将一个对象分配给具有序列化文本字符串的 "order" 属性的数据属性,因此 jQuery 基本上对其进行双重编码。要使其按照您的意愿运行,您必须将表单转换为对象并将 "order" 属性分配给该对象。看到这个post:Convert form data to JavaScript object with jQuery
// taking the example from the above link, you do this instead
order = $("#sitestructure-form"). serializeObject();
已通过执行以下操作修复:
$.ajax({
type: 'POST',
url: 'ajax-process.php?',
data: $("#sitestructure-form").serialize() + "&action=sitemap-reordernavigation",
success: function(d){$("#structureupdate").html(d);}
});
当我使用 ajax 将序列化数据发送到 PHP 文件时,有时会 URL 编码,具体取决于我的操作方式。
最初我有以下代码工作正常:
$.ajax({
type: 'POST',
url: 'ajax-process.php',
data: $("#sitestructure-form").serialize(),
success: function(d){$("#structureupdate").html(d);}
});
数据已发送到我的 PHP 文件,我可以回显它,它看起来像这样。
[{"id":20,"children":[{"id":21}]},{"id":19},{"id":18,"children":[{"id":14}]},{"id":16},{"id":13,"children":[{"id":11}]},{"id":17},{"id":15},{"id":12}]
我想发送不止一条数据,我调用了序列化数据 'order' 并向其添加了 'process' 所以我将我的代码更新为以下内容:
$.ajax({
type: 'POST',
url: 'ajax-process.php',
data: {
order: $("#sitestructure-form").serialize(),
process: "sitemap-reordernavigation"
},
success: function(d){$("#structureupdate").html(d);}
});
然而,当我检索在 'order' 中发送的序列化数据时,输出如下所示:
data=%5B%7B%22id%22%3A20%2C%22children%22%3A%5B%7B%22id%22%3A21%7D%5D%7D%2C%7B%22id%22%3A19%7D%2C%7B%22id%22%3A18%2C%22children%22%3A%5B%7B%22id%22%3A14%7D%5D%7D%2C%7B%22id%22%3A16%7D%2C%7B%22id%22%3A13%2C%22children%22%3A%5B%7B%22id%22%3A11%7D%5D%7D%2C%7B%22id%22%3A17%7D%2C%7B%22id%22%3A15%7D%2C%7B%22id%22%3A12%7D%5D
我能想到的解决这个问题的唯一方法是使用php对其进行urldecode,然后使用str_replace删除前面的'data='位,就像这样.
$data = str_replace("data=","",urldecode($_POST['order']));
我怎样才能让它与 AJAX 一起工作,这样我就不必对它进行 urldecode 了?
我试过使用变量并将 processData 设置为 false,但这似乎不起作用。
var order = $("#sitestructure-form").serialize();
$.ajax({
type: 'POST',
url: 'ajax-process.php',
processData: false,
data: {
order: order,
process: "sitemap-reordernavigation"
},
success: function(d){$("#structureupdate").html(d);}
});
我对 AJAX/Jquery 的了解相当有限,如有任何帮助,我们将不胜感激。
那是因为您第一次将序列化文本字符串提供给数据属性并且 jQuery 没有将其转换为序列化字符串。第二个是将一个对象分配给具有序列化文本字符串的 "order" 属性的数据属性,因此 jQuery 基本上对其进行双重编码。要使其按照您的意愿运行,您必须将表单转换为对象并将 "order" 属性分配给该对象。看到这个post:Convert form data to JavaScript object with jQuery
// taking the example from the above link, you do this instead
order = $("#sitestructure-form"). serializeObject();
已通过执行以下操作修复:
$.ajax({
type: 'POST',
url: 'ajax-process.php?',
data: $("#sitestructure-form").serialize() + "&action=sitemap-reordernavigation",
success: function(d){$("#structureupdate").html(d);}
});