使用JavaScript将参数添加到URL

Les*_*ezi 234 javascript parameters url parsing query-string

在使用AJAX调用的Web应用程序中,我需要提交请求,但在URL的末尾添加一个参数,例如:

原始网址:

HTTP://server/myapp.php ID = 10

结果URL:

http://server/myapp.php?id = 10 &enabled = true

寻找一个解析每个参数的URL的JavaScript函数,然后添加新参数或更新值(如果已存在).

Via*_*art 210

您可以使用以下方法之一:

例:

var url = new URL("http://foo.bar/?x=1&y=2");

// If your expected result is "http://foo.bar/?x=1&y=2&x=42"
url.searchParams.append('x', 42);

// If your expected result is "http://foo.bar/?x=42&y=2"
url.searchParams.set('x', 42);
Run Code Online (Sandbox Code Playgroud)

  • 太糟糕的IE不支持它. (23认同)
  • 好消息@MJeffryes!仍然不支持IE和Netscape. (3认同)
  • 我想添加一个不带值的查询参数,例如,将XML添加到http://foo.bar/?x = 1&y = 2`中,以便最终结果是http://foo.bar/ ?x = 1&y = 2&XML`。这可能吗?我尝试了``url.searchParams.set('XML');'',``url.searchParams.set('XML',null);`和``url.searchParams.set('XML',undefined);`-但是没有一个在* Chrome 63 *中起作用。 (2认同)
  • 谢谢!不幸的是,iOS尚不支持它。https://developer.mozilla.org/zh-CN/docs/Web/API/URLSearchParams (2认同)
  • iOS现在确实支持URLSearchParams(自@kanji发表评论后9天开始) (2认同)
  • 是的,IE无法很好地支持它,但是有一个polyfill可以处理该问题:https://github.com/lifaon74/url-polyfill (2认同)
  • `url.searchParams` 是对 `URLSearchParams` 对象的只读引用。这意味着您不能这样做: `url.searchParam = new URLSearchParam();` 但您可以使用 `.set()` 就地修改对象的内容。就像:`const a = {b: 0}` 您无法修改引用:`a = {b: 1}`,但您可以就地修改对象的内容:`ab = 1` 在您的JS 控制台;-) (2认同)

ann*_*ata 180

您需要适应的基本实现看起来像这样:

function insertParam(key, value)
{
    key = encodeURI(key); value = encodeURI(value);

    var kvp = document.location.search.substr(1).split('&');

    var i=kvp.length; var x; while(i--) 
    {
        x = kvp[i].split('=');

        if (x[0]==key)
        {
            x[1] = value;
            kvp[i] = x.join('=');
            break;
        }
    }

    if(i<0) {kvp[kvp.length] = [key,value].join('=');}

    //this will reload the page, it's likely better to store this until finished
    document.location.search = kvp.join('&'); 
}
Run Code Online (Sandbox Code Playgroud)

这大约是正则表达式或基于搜索的解决方案的两倍,但这完全取决于查询字符串的长度和任何匹配的索引


为了完成而我使用慢速正则表达式进行基准测试(大约慢了150%)

function insertParam2(key,value)
{
    key = encodeURIComponent(key); value = encodeURIComponent(value);

    var s = document.location.search;
    var kvp = key+"="+value;

    var r = new RegExp("(&|\\?)"+key+"=[^\&]*");

    s = s.replace(r,"$1"+kvp);

    if(!RegExp.$1) {s += (s.length>0 ? '&' : '?') + kvp;};

    //again, do what you will here
    document.location.search = s;
}
Run Code Online (Sandbox Code Playgroud)

  • 使用escape()来转义URL参数是错误的.它打破了"+"中的值.您应该使用encodeURIComponent.完整的讨论:http://xkr.us/articles/javascript/encode-compare (14认同)
  • 当它有这么多错误时,它为什么会得到这么多的赞成. (12认同)
  • 你不应该使用`encodeURIComponent`而不是`encodeURI`?否则,你的名字或值中的任何字符如`=`,`&`都会破坏URI. (8认同)
  • 如果url中没有参数,则会得到?&param = value (5认同)
  • 我正在调用此函数,页面正在无限循环中重新加载.请帮忙! (4认同)
  • 再次感谢.请参阅http://www.lessanvaezi.com/wp-content/uploads/2009/01/test.html以获取方法的基本比较 (2认同)
  • 主题标签怎么样? (2认同)
  • 我受到第一个解决方案的启发 - 好主意,但代码不可读,而且它不支持更多的参数,所以我做了一个 **new ,它确实接受一个带有`key: value,`对和它很容易理解 https://jsfiddle.net/1u9fqad3/1/** *UPDATE: 当 document.location.search 为空或 1 个字符时的固定情况* (2认同)
  • 被否决,因为它有从未修复的错误:) (2认同)

Zoi*_*arp 124

const urlParams = new URLSearchParams(window.location.search);

urlParams.set('order', 'date');

window.location.search = urlParams;
Run Code Online (Sandbox Code Playgroud)

.set 第一个参数是键,第二个参数是值。

  • 这是正确的答案,应该获得最高票数。这个新的 API 是 URL 处理的权威 (13认同)
  • 喜欢它的简单性以及它使用本机浏览器方法 (5认同)
  • IE还有用吗?因为Edge现在就在这里? (3认同)
  • 如果您的目标是政府,IE 仍然相关(2021 年 6 月)。 (3认同)
  • 这是正确的,但需要将 .toString() 添加到最后一行的 UrlParams 中。 (3认同)

小智 63

谢谢大家的贡献.我使用annakata代码并修改为还包括url中根本没有查询字符串的情况.希望这会有所帮助.

function insertParam(key, value) {
        key = escape(key); value = escape(value);

        var kvp = document.location.search.substr(1).split('&');
        if (kvp == '') {
            document.location.search = '?' + key + '=' + value;
        }
        else {

            var i = kvp.length; var x; while (i--) {
                x = kvp[i].split('=');

                if (x[0] == key) {
                    x[1] = value;
                    kvp[i] = x.join('=');
                    break;
                }
            }

            if (i < 0) { kvp[kvp.length] = [key, value].join('='); }

            //this will reload the page, it's likely better to store this until finished
            document.location.search = kvp.join('&');
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 这应该实际检查`if(kvp.length == 1 && kvp [0] ="")`? (5认同)
  • 最好从`escape(key)`和`escape(value)`更改为`encodeURIComponent`函数. (3认同)

Meh*_*dız 57

这是非常简单的解决方案.它不控制参数存在,也不改变现有值.它将您的参数添加到end,因此您可以在后端代码中获取最新值.

function addParameterToURL(param){
    _url = location.href;
    _url += (_url.split('?')[1] ? '&':'?') + param;
    return _url;
}
Run Code Online (Sandbox Code Playgroud)

  • 你还应该在网址中考虑"#"..这里有一些代码slop:`url =(url.indexOf("?")!= -1?url.split("?")[0] +"?" + part +"&"+ url.split("?")[1] :( url.indexOf("#")!= -1?url.split("#")[0] +"?"+ part +" #"+ url.split("#")[1]:url +'?'+ part));` (6认同)
  • @stephen 明白了 :) 原来我在 16 年是个傻孩子 :) (3认同)
  • @kanzure这东西看起来很邪恶,但这正是我想要的。谢谢。 (2认同)

小智 33

这是一个非常简化的版本,为了易读性和更少的代码行而不是微优化的性能进行权衡(我们正在谈论几毫秒的差异,实际上......由于其性质(在当前文档的位置上运行) ),这很可能会在页面上运行一次).

/**
* Add a URL parameter (or changing it if it already exists)
* @param {search} string  this is typically document.location.search
* @param {key}    string  the key to set
* @param {val}    string  value 
*/
var addUrlParam = function(search, key, val){
  var newParam = key + '=' + val,
      params = '?' + newParam;

  // If the "search" string exists, then build params from it
  if (search) {
    // Try to replace an existance instance
    params = search.replace(new RegExp('([?&])' + key + '[^&]*'), '$1' + newParam);

    // If nothing was replaced, then add the new param to the end
    if (params === search) {
      params += '&' + newParam;
    }
  }

  return params;
};
Run Code Online (Sandbox Code Playgroud)

然后你会像这样使用它:

document.location.pathname + addUrlParam(document.location.search, 'foo', 'bar');
Run Code Online (Sandbox Code Playgroud)

  • +1 我喜欢你如何指定除 document.location.search 之外的其他内容 (2认同)
  • 加勒特:你能否修复你的答案,以便正确地替换现有参数?这只是在RegExp中用`([\?&])`替换`[\?&]`的问题(我只是自己编辑,但我不确定社区政策是否允许修复答案中的错误) . (2认同)

fre*_*dev 20

/**
* Add a URL parameter 
* @param {string} url 
* @param {string} param the key to set
* @param {string} value 
*/
var addParam = function(url, param, value) {
   param = encodeURIComponent(param);
   var a = document.createElement('a');
   param += (value ? "=" + encodeURIComponent(value) : ""); 
   a.href = url;
   a.search += (a.search ? "&" : "") + param;
   return a.href;
}

/**
* Add a URL parameter (or modify if already exists)
* @param {string} url 
* @param {string} param the key to set
* @param {string} value 
*/
var addOrReplaceParam = function(url, param, value) {
   param = encodeURIComponent(param);
   var r = "([&?]|&amp;)" + param + "\\b(?:=(?:[^&#]*))*";
   var a = document.createElement('a');
   var regex = new RegExp(r);
   var str = param + (value ? "=" + encodeURIComponent(value) : ""); 
   a.href = url;
   var q = a.search.replace(regex, "$1"+str);
   if (q === a.search) {
      a.search += (a.search ? "&" : "") + str;
   } else {
      a.search = q;
   }
   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/48z7z4kx/


meo*_*ouw 19

我有一个'类'来做这个,这里是:

function QS(){
    this.qs = {};
    var s = location.search.replace( /^\?|#.*$/g, '' );
    if( s ) {
        var qsParts = s.split('&');
        var i, nv;
        for (i = 0; i < qsParts.length; i++) {
            nv = qsParts[i].split('=');
            this.qs[nv[0]] = nv[1];
        }
    }
}

QS.prototype.add = function( name, value ) {
    if( arguments.length == 1 && arguments[0].constructor == Object ) {
        this.addMany( arguments[0] );
        return;
    }
    this.qs[name] = value;
}

QS.prototype.addMany = function( newValues ) {
    for( nv in newValues ) {
        this.qs[nv] = newValues[nv];
    }
}

QS.prototype.remove = function( name ) {
    if( arguments.length == 1 && arguments[0].constructor == Array ) {
        this.removeMany( arguments[0] );
        return;
    }
    delete this.qs[name];
}

QS.prototype.removeMany = function( deleteNames ) {
    var i;
    for( i = 0; i < deleteNames.length; i++ ) {
        delete this.qs[deleteNames[i]];
    }
}

QS.prototype.getQueryString = function() {
    var nv, q = [];
    for( nv in this.qs ) {
        q[q.length] = nv+'='+this.qs[nv];
    }
    return q.join( '&' );
}

QS.prototype.toString = QS.prototype.getQueryString;

//examples
//instantiation
var qs = new QS;
alert( qs );

//add a sinle name/value
qs.add( 'new', 'true' );
alert( qs );

//add multiple key/values
qs.add( { x: 'X', y: 'Y' } );
alert( qs );

//remove single key
qs.remove( 'new' )
alert( qs );

//remove multiple keys
qs.remove( ['x', 'bogus'] )
alert( qs );
Run Code Online (Sandbox Code Playgroud)

我已经重写了toString方法,所以不需要调用QS :: getQueryString,你可以使用QS :: toString,或者我在示例中所做的只是依赖于被强制转换为字符串的对象.


Ame*_*icA 14

URL类内部有一个内置函数,您可以使用它来轻松处理查询字符串键/值参数:

const url = new URL(window.location.href);
// url.searchParams has several function, we just use `set` function
// to set a value, if you just want to append without replacing value
// let use `append` function

url.searchParams.set('key', 'value');

console.log(url.search) // <== '?key=value'

// if window.location.href has already some qs params this `set` function
// modify or append key/value in it
Run Code Online (Sandbox Code Playgroud)

有关的更多信息searchParams functions


Nei*_*ham 11

此解决方案使用更新的搜索参数更新窗口的当前 URL,而无需实际重新加载页面。这种方法在 PWA/SPA 环境中很有用。

function setURLSearchParam(key, value) {
  const url = new URL(window.location.href);
  url.searchParams.set(key, value);
  window.history.pushState({ path: url.href }, '', url.href);
}
Run Code Online (Sandbox Code Playgroud)


Sas*_*asa 8

如果你有一个带有url的字符串,你想用param装饰,你可以试试这个:

urlstring += ( urlstring.match( /[\?]/g ) ? '&' : '?' ) + 'param=value';
Run Code Online (Sandbox Code Playgroud)

这意味着什么?将是参数的前缀,但如果你已经有in urlstring,than &将成为前缀.

encodeURI( paramvariable )如果你没有硬编码参数,我也会建议做,但它在里面paramvariable; 或者如果你有滑稽的角色.

有关该功能的使用,请参阅javascript URL编码encodeURI.


lin*_*ram 7

以下功能将帮助您向 URL 或从 URL 添加、更新和删除参数。

//example1and

var myURL = '/search';

myURL = updateUrl(myURL,'location','california');
console.log('added location...' + myURL);
//added location.../search?location=california

myURL = updateUrl(myURL,'location','new york');
console.log('updated location...' + myURL);
//updated location.../search?location=new%20york

myURL = updateUrl(myURL,'location');
console.log('removed location...' + myURL);
//removed location.../search
Run Code Online (Sandbox Code Playgroud)

//示例2

var myURL = '/search?category=mobile';

myURL = updateUrl(myURL,'location','california');
console.log('added location...' + myURL);
//added location.../search?category=mobile&location=california

myURL = updateUrl(myURL,'location','new york');
console.log('updated location...' + myURL);
//updated location.../search?category=mobile&location=new%20york

myURL = updateUrl(myURL,'location');
console.log('removed location...' + myURL);
//removed location.../search?category=mobile
Run Code Online (Sandbox Code Playgroud)

//示例3

var myURL = '/search?location=texas';

myURL = updateUrl(myURL,'location','california');
console.log('added location...' + myURL);
//added location.../search?location=california

myURL = updateUrl(myURL,'location','new york');
console.log('updated location...' + myURL);
//updated location.../search?location=new%20york

myURL = updateUrl(myURL,'location');
console.log('removed location...' + myURL);
//removed location.../search
Run Code Online (Sandbox Code Playgroud)

//示例4

var myURL = '/search?category=mobile&location=texas';

myURL = updateUrl(myURL,'location','california');
console.log('added location...' + myURL);
//added location.../search?category=mobile&location=california

myURL = updateUrl(myURL,'location','new york');
console.log('updated location...' + myURL);
//updated location.../search?category=mobile&location=new%20york

myURL = updateUrl(myURL,'location');
console.log('removed location...' + myURL);
//removed location.../search?category=mobile
Run Code Online (Sandbox Code Playgroud)

//示例5

var myURL = 'https://example.com/search?location=texas#fragment';

myURL = updateUrl(myURL,'location','california');
console.log('added location...' + myURL);
//added location.../search?location=california#fragment

myURL = updateUrl(myURL,'location','new york');
console.log('updated location...' + myURL);
//updated location.../search?location=new%20york#fragment

myURL = updateUrl(myURL,'location');
console.log('removed location...' + myURL);
//removed location.../search#fragment
Run Code Online (Sandbox Code Playgroud)

这是功能。

function updateUrl(url,key,value){
      if(value!==undefined){
        value = encodeURI(value);
      }
      var hashIndex = url.indexOf("#")|0;
      if (hashIndex === -1) hashIndex = url.length|0;
      var urls = url.substring(0, hashIndex).split('?');
      var baseUrl = urls[0];
      var parameters = '';
      var outPara = {};
      if(urls.length>1){
          parameters = urls[1];
      }
      if(parameters!==''){
        parameters = parameters.split('&');
        for(k in parameters){
          var keyVal = parameters[k];
          keyVal = keyVal.split('=');
          var ekey = keyVal[0];
          var evalue = '';
          if(keyVal.length>1){
              evalue = keyVal[1];
          }
          outPara[ekey] = evalue;
        }
      }

      if(value!==undefined){
        outPara[key] = value;
      }else{
        delete outPara[key];
      }
      parameters = [];
      for(var k in outPara){
        parameters.push(k + '=' + outPara[k]);
      }

      var finalUrl = baseUrl;

      if(parameters.length>0){
        finalUrl += '?' + parameters.join('&'); 
      }

      return finalUrl + url.substring(hashIndex); 
  }
Run Code Online (Sandbox Code Playgroud)


T04*_*435 7

这是添加查询参数的简单方法:

const query = new URLSearchParams(window.location.search);
query.append("enabled", "true");
Run Code Online (Sandbox Code Playgroud)

这就是更多.

请注意支持规格.

  • 似乎在任何版本的Internet Explorer中都不支持此功能 (4认同)

Jin*_*oss 7

添加到@Vianney的答案/sf/answers/3091265901/

我们可以在node中导入内置的URL模块,如下所示

const { URL } = require('url');
Run Code Online (Sandbox Code Playgroud)

例子:

Terminal $ node
> const { URL } = require('url');
undefined
> let url = new URL('', 'http://localhost:1989/v3/orders');
undefined
> url.href
'http://localhost:1989/v3/orders'
> let fetchAll=true, timePeriod = 30, b2b=false;
undefined
> url.href
'http://localhost:1989/v3/orders'
>  url.searchParams.append('fetchAll', fetchAll);
undefined
>  url.searchParams.append('timePeriod', timePeriod);
undefined
>  url.searchParams.append('b2b', b2b);
undefined
> url.href
'http://localhost:1989/v3/orders?fetchAll=true&timePeriod=30&b2b=false'
> url.toString()
'http://localhost:1989/v3/orders?fetchAll=true&timePeriod=30&b2b=false'
Run Code Online (Sandbox Code Playgroud)

有用的链接:

https://developer.mozilla.org/en-US/docs/Web/API/URL https://developer.mozilla.org/en/docs/Web/API/URLSearchParams


Les*_*ezi 6

这是我自己的尝试,但我会使用 annakata 的答案,因为它看起来更清晰:

function AddUrlParameter(sourceUrl, parameterName, parameterValue, replaceDuplicates)
{
    if ((sourceUrl == null) || (sourceUrl.length == 0)) sourceUrl = document.location.href;
    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];
            }
        }
    }
    if (newQueryString == "")
        newQueryString = "?";
    else
        newQueryString += "&";
    newQueryString += parameterName + "=" + parameterValue;

    return urlParts[0] + newQueryString;
}
Run Code Online (Sandbox Code Playgroud)

另外,我从 stackoverflow 上的另一篇文章中找到了这个 jQuery 插件,如果您需要更大的灵活性,可以使用它:http : //plugins.jquery.com/project/query-object

我认为代码将是(尚未测试):

return $.query.parse(sourceUrl).set(parameterName, parameterValue).toString();
Run Code Online (Sandbox Code Playgroud)


Cha*_*uan 6

查看https://github.com/derek-watson/jsUri

Uri和javascript中的查询字符串操作。

该项目包含了Steven Levithan出色的parseUri正则表达式库。您可以安全地解析各种形状和大小的URL,但是这些URL无效或令人生厌。


Mr.*_*an0 6

有时我们?在最后的URL 看到,我发现了一些产生结果的解决方案file.php?&foo=bar.我按照自己的意愿完成了自己的解决方案工作!

location.origin + location.pathname + location.search + (location.search=='' ? '?' : '&') + 'lang=ar'
Run Code Online (Sandbox Code Playgroud)

注意:location.origin在IE中不起作用,这是它的修复.


Imm*_*ion 6

它处理这样的 URL:

  • 空的
  • 没有任何参数
  • 已经有一些参数
  • 末尾有?,但同时没有任何参数

它不处理这样的 URL:

  • 带有片段标识符(即散列,#)
  • 如果 URL 已经有必需的查询参数(那么将会有重复)

工作于:

  • 铬32+
  • 火狐浏览器 26+
  • Safari 7.1+
function appendQueryParameter(url, name, value) {
    if (url.length === 0) {
        return;
    }

    let rawURL = url;

    // URL with `?` at the end and without query parameters
    // leads to incorrect result.
    if (rawURL.charAt(rawURL.length - 1) === "?") {
        rawURL = rawURL.slice(0, rawURL.length - 1);
    }

    const parsedURL = new URL(rawURL);
    let parameters = parsedURL.search;

    parameters += (parameters.length === 0) ? "?" : "&";
    parameters = (parameters + name + "=" + value);

    return (parsedURL.origin + parsedURL.pathname + parameters);
}
Run Code Online (Sandbox Code Playgroud)

带有 ES6 模板字符串的版本。

工作于:

  • 铬41+
  • 火狐浏览器 32+
  • Safari 9.1+
function appendQueryParameter(url, name, value) {
    if (url.length === 0) {
        return;
    }

    let rawURL = url;

    // URL with `?` at the end and without query parameters
    // leads to incorrect result.
    if (rawURL.charAt(rawURL.length - 1) === "?") {
        rawURL = rawURL.slice(0, rawURL.length - 1);
    }

    const parsedURL = new URL(rawURL);
    let parameters = parsedURL.search;

    parameters += (parameters.length === 0) ? "?" : "&";
    parameters = `${parameters}${name}=${value}`;

    return `${parsedURL.origin}${parsedURL.pathname}${parameters}`;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

尝试这个。

// uses the URL class
function setParam(key, value) {
            let url = new URL(window.document.location);
            let params = new URLSearchParams(url.search.slice(1));

            if (params.has(key)) {
                params.set(key, value);
            }else {
                params.append(key, value);
            }
        }
Run Code Online (Sandbox Code Playgroud)

  • `url.searchParams` 是该 `URL` 对象的预初始化参数列表。 (2认同)