Javascript 如何为Ajax请求添加/管理持久URL参数?
假设我的站点上有两个资源列表:用户和组。当我以10的增量对每个页面进行分页时,我希望保存列表的状态,这样当我将页面的URL提供给某人时,他们将被导航到具有相同页面大小的相同页面 使用一个列表很容易,我甚至会放弃Ajax而使用简单的HTTP参数,但为了增加复杂性,Ajax命令都采用相同的参数,例如:Javascript 如何为Ajax请求添加/管理持久URL参数?,javascript,jquery,ajax,anchor,Javascript,Jquery,Ajax,Anchor,假设我的站点上有两个资源列表:用户和组。当我以10的增量对每个页面进行分页时,我希望保存列表的状态,这样当我将页面的URL提供给某人时,他们将被导航到具有相同页面大小的相同页面 使用一个列表很容易,我甚至会放弃Ajax而使用简单的HTTP参数,但为了增加复杂性,Ajax命令都采用相同的参数,例如: user/getlist?maximum=10&offset=0&systemId=123456 group/getlist?maximum=10&offset=0&s
user/getlist?maximum=10&offset=0&systemId=123456
group/getlist?maximum=10&offset=0&systemId=123456
最初,我考虑使用锚,这样URL看起来像:
admin/users+groups.php#?maximum=10&offset=0&systemId=123456
但这显然不适用于两个列表。我可以在jQuery中轻松地完成这项工作,还是需要在原始JavaScript中编写这项工作?您可以使用逗号(或破折号)分隔符完成这项工作,并将每个列表都设置为querystring参数 更新时,页面的URL如下所示:
admin/users+groups.php?ulist=10,0123456&glist=12,0123457 然后在javascript中,调用此函数以获取querystring参数值:
function getParameterByName(name) {
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
results = regex.exec(location.search);
return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}
// you should probably break this out and null check the parameter before splitting, but for the sake of brevity:
var userListVals=getParameterByName("ulist").split(",");
var groupListVals=getParameterByName("glist").split(",");
var userListURL = "/user/getlist?maximum=" + userListVals[0] + "&offset=" + userListVals[1] + "@systemId=" + userListVals[2];
var groupListURL = "/user/getlist?maximum=" + groupListVals[0] + "&offset=" + groupListVals[1] + "@systemId=" + groupListVals[2];
它依赖于值的正确顺序,但是如果您自己生成URL,那应该不会有问题
更新:这是我提出的解决方案。首先,我们需要在页面加载时从锚点加载AJAX参数:
$(document).ready(function() {
if (window.location.hash.indexOf('#?') == 0) {
var hashParameters = window.location.hash.substring(2).split('&');
var hashIndex = 0;
for (var i = 0; i < hashParameters.length; i++) {
var hp = hashParameters[i]
var delim = hp.indexOf('=');
var key = hp.substring(0, delim);
var value = hp.substring(delim + 1);
addParameter();
$('#parameter-' + i + '-key').val(key);
$('#parameter-' + i + '-value').val(value);
}
} else {
addParameter();
$('#parameter-0-key').val('id');
}
});
如果jQuery能想出一种像这样向URL添加/删除参数的方法,那就太好了。我不确定我是否完全理解你的问题-但是,由于你的最终目标是拥有一个链接,AJAX实际上已经不存在了。。。为什么不坚持你原来的计划,但做一些简单的事情,比如添加一个参数,你试图修改它的列表,比如:
admin/users groups.php?view=users&max[…]
-?我正在对一个现有系统进行编码,我无法改变这是Ajax调用的事实。那么问题是什么?只要你有两个控件——一个用于一个列表,另一个用于另一个列表,我看不出你所描述的内容会产生任何问题……对不起,我想我的问题不够具体。在jQuery中有没有一种快速的方法来实现这一点(或者类似的方法),或者我需要编写一堆.substring
行代码,直到它工作为止?我想我可以使用jQuery.param创建参数列表。但是我正在查询两个唯一的资源,user
和group
。我无法像这样将列表组合在一起。请检查更改。我认为这将获得URL中所需的所有参数,然后将它们分解为对每个列表ajax请求有用的参数。这不起作用,因为每次我尝试前进页面时,ajax都会更新URL并实际导航到新页面,也就是说,?ulist=10,0123456&glist=12,0123457
?ulist=10,10123456&glist=12,0123457导致加载新页面。这不应该发生。你能发布整个ajax调用代码吗?ajax调用不应该更改页面URL。它应该只从URL获取值,并在幕后将它们传递到web服务调用中。当然,在初始页面加载之后,它应该依赖于您保存当前页面的一些变量,而不是querystring值。但这正是我需要做的。我需要AJAX调用来更改URL,以便客户端可以将页面的URL复制给我们以获得支持,或者复制给客户端组织的其他成员。
function getParameterValues() {
// ...
var anchor = '';
for (var i = 0; i < index + 1; i++) {
var keyName = '#parameter-' + i + '-key';
var valueName = '#parameter-' + i + '-value';
var key = $(keyName).val();
var value = $(valueName).val();
if (typeof key == 'undefined' || typeof value == 'undefined') {
continue;
}
if (key == '') {
continue;
}
// ...
if (anchor.length == 0) {
anchor += '?' + key + '=' + value;
} else {
anchor += '&' + key + '=' + value;
}
}
window.location.hash = '#' + anchor;
return values;
}