Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何为Ajax请求添加/管理持久URL参数?_Javascript_Jquery_Ajax_Anchor - Fatal编程技术网

Javascript 如何为Ajax请求添加/管理持久URL参数?

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

假设我的站点上有两个资源列表:用户和组。当我以10的增量对每个页面进行分页时,我希望保存列表的状态,这样当我将页面的URL提供给某人时,他们将被导航到具有相同页面大小的相同页面

使用一个列表很容易,我甚至会放弃Ajax而使用简单的HTTP参数,但为了增加复杂性,Ajax命令都采用相同的参数,例如:

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;
}