如何将参数添加到已包含其他参数且可能是锚点的URL

ske*_*rit 14 javascript

我想知道如何在现有网址中添加新参数.问题是:网址还可能包含锚点.

例如:

http://www.example.com?foo=bar#hashme
Run Code Online (Sandbox Code Playgroud)

我想为它添加另一个参数,因此它会导致:

http://www.example.com?foo=bar&x=y#hashme
Run Code Online (Sandbox Code Playgroud)

ske*_*rit 23

我使用了The Awesome One解决方案的部分内容,以及在这个问题上找到的解决方案:

使用JavaScript将参数添加到URL

将它们组合到此脚本中:

function addParameter(url, parameterName, parameterValue, atStart/*Add param before others*/){
    replaceDuplicates = true;
    if(url.indexOf('#') > 0){
        var cl = url.indexOf('#');
        urlhash = url.substring(url.indexOf('#'),url.length);
    } else {
        urlhash = '';
        cl = url.length;
    }
    sourceUrl = url.substring(0,cl);

    var urlParts = sourceUrl.split("?");
    var newQueryString = "";

    if (urlParts.length > 1)
    {
        var parameters = urlParts[1].split("&");
        for (var i=0; (i < parameters.length); i++)
        {
            var parameterParts = parameters[i].split("=");
            if (!(replaceDuplicates && parameterParts[0] == parameterName))
            {
                if (newQueryString == "")
                    newQueryString = "?";
                else
                    newQueryString += "&";
                newQueryString += parameterParts[0] + "=" + (parameterParts[1]?parameterParts[1]:'');
            }
        }
    }
    if (newQueryString == "")
        newQueryString = "?";

    if(atStart){
        newQueryString = '?'+ parameterName + "=" + parameterValue + (newQueryString.length>1?'&'+newQueryString.substring(1):'');
    } else {
        if (newQueryString !== "" && newQueryString != '?')
            newQueryString += "&";
        newQueryString += parameterName + "=" + (parameterValue?parameterValue:'');
    }
    return urlParts[0] + newQueryString + urlhash;
};
Run Code Online (Sandbox Code Playgroud)

例: addParameter('http://www.example.com?foo=bar#hashme', 'bla', 'valuebla', false)

结果是 http://www.example.com?foo=bar&bla=valuebla#hashme


fre*_*dev 10

这可以是另一个很好的解决方案,如果参数已经存在,该版本甚至可以替换参数,添加参数不带值:

function addParam(url, param, value) {
   var a = document.createElement('a'), regex = /(?:\?|&amp;|&)+([^=]+)(?:=([^&]*))*/g;
   var match, str = []; a.href = url; param = encodeURIComponent(param);
   while (match = regex.exec(a.search))
       if (param != match[1]) str.push(match[1]+(match[2]?"="+match[2]:""));
   str.push(param+(value?"="+ encodeURIComponent(value):""));
   a.search = str.join("&");
   return a.href;
}

url = "http://www.example.com#hashme";
newurl = addParam(url, "ciao", "1");
alert(newurl);
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/bknE4/81/