所以我使用 ajax 请求来传递一些数据以进行过滤。
然后我使用历史记录.js因此我可以更改 url 并向浏览器添加状态,从而可以返回、前进等。这样,我就可以使用 ajax 请求或普通请求来过滤数据。目前为止,一切都好。
我的问题是,在我通过ajax请求传递的数据中有一个数组:
function updateContent(url, state) {
$.ajax({
type: 'GET',
data: {name: state.filter_name, num: state.filter_number,
data: state.filter_data, array: state.filter_array},
url: url,
success: function(msg) {
$('#ajax').html(msg);
}
});
}
这将向此 URL 发出请求:
http: //localhost/Project/Controller/?filter_array%5B%5D=1&filter_array%5B%5D=50&filter_array%5B%5D=70.
我想把这个网址传递给 history.pushstate
如果我使用 jsenconde 然后手动构建 url,url 会略有不同,如下所示:
http://localhost/Project/Controller/?filter_array=["1","50","70"]
虽然它更干净,但我在某处读到你不应该在 url 中使用 [],但即使我使用这种方式,我也会得到两种类型的 GET url,ajax URL ?filter_array%5B%5D=1&filter_array%5B%5D=50&filter_array%5B%5D=70.
和 json 网址?filter_array=["1","50","70"]
.
所以我只需要一个解决方案,让我只得到一种类型的 GET url,这样我就可以使用相同的 url 到 ajax 和普通请求。
传递值数组的标准方法是重复传递带有 []
的名称(url 编码),如第一个示例所示。
您需要以符合此要求的方式生成您的 URL...
filter_array[]=1&filter_array[]=2&filter_array[]=3
当然,正如您所显示的那样进行编码....
filter_array%5B%5D=1&filter_array%5B%5D=2&filter_array%5B%5D=3
如果你坚持这种格式,你的代码将更具可移植性(例如 ASP.Net 将自动执行到List的转换,许多PHP库也是如此)。
有什么原因不能生成这种格式的网址吗?
这里的区别在于,一个使用标准表单编码,另一个转换JSON
jQuery是对JSON对象进行URL编码,以便没有非法字符。如果你想使用 javascript 检索该 GET 变量,你必须从 URL 中提取数据,URL 对其进行解码,然后使用 JSON.parse() 将其重新转换为 JavaScript 对象。
http://www.w3schools.com/jsref/jsref_encodeuri.asp