更改网址参数

Sin*_*hus 173 javascript url url-parsing url-parameters query-string

我有这个网址:

site.fwx?position=1&archiveid=5000&columns=5&rows=20&sorting=ModifiedTimeAsc
Run Code Online (Sandbox Code Playgroud)

我需要的是能够将'rows'url param值更改为我指定的内容,比方说10.如果'rows'不存在,我需要将它添加到url的末尾并添加价值我已经指定(10).

Adi*_*lik 104

我已经扩展了Sujoy的代码来构成一个函数.

/**
 * http://stackoverflow.com/a/10997390/11236
 */
function updateURLParameter(url, param, paramVal){
    var newAdditionalURL = "";
    var tempArray = url.split("?");
    var baseURL = tempArray[0];
    var additionalURL = tempArray[1];
    var temp = "";
    if (additionalURL) {
        tempArray = additionalURL.split("&");
        for (var i=0; i<tempArray.length; i++){
            if(tempArray[i].split('=')[0] != param){
                newAdditionalURL += temp + tempArray[i];
                temp = "&";
            }
        }
    }

    var rows_txt = temp + "" + param + "=" + paramVal;
    return baseURL + "?" + newAdditionalURL + rows_txt;
}
Run Code Online (Sandbox Code Playgroud)

功能调用:

var newURL = updateURLParameter(window.location.href, 'locId', 'newLoc');
newURL = updateURLParameter(newURL, 'resId', 'newResId');

window.history.replaceState('', '', updateURLParameter(window.location.href, "param", "value"));
Run Code Online (Sandbox Code Playgroud)

更新版本,也处理URL上的锚点.

function updateURLParameter(url, param, paramVal)
{
    var TheAnchor = null;
    var newAdditionalURL = "";
    var tempArray = url.split("?");
    var baseURL = tempArray[0];
    var additionalURL = tempArray[1];
    var temp = "";

    if (additionalURL) 
    {
        var tmpAnchor = additionalURL.split("#");
        var TheParams = tmpAnchor[0];
            TheAnchor = tmpAnchor[1];
        if(TheAnchor)
            additionalURL = TheParams;

        tempArray = additionalURL.split("&");

        for (var i=0; i<tempArray.length; i++)
        {
            if(tempArray[i].split('=')[0] != param)
            {
                newAdditionalURL += temp + tempArray[i];
                temp = "&";
            }
        }        
    }
    else
    {
        var tmpAnchor = baseURL.split("#");
        var TheParams = tmpAnchor[0];
            TheAnchor  = tmpAnchor[1];

        if(TheParams)
            baseURL = TheParams;
    }

    if(TheAnchor)
        paramVal += "#" + TheAnchor;

    var rows_txt = temp + "" + param + "=" + paramVal;
    return baseURL + "?" + newAdditionalURL + rows_txt;
}
Run Code Online (Sandbox Code Playgroud)

  • 此函数还有几个其他问题:(1) paramVal 未进行 uri 编码。(2) 如果 paramVal 为 null,则得到 foo=null。它应该是 foo= (或者更好,完全删除 foo)。 (2认同)

Mat*_*hen 94

我想你想要查询插件.

例如:

window.location.search = jQuery.query.set("rows", 10);
Run Code Online (Sandbox Code Playgroud)

无论行的当前状态如何,这都将起作用.

  • +1非常好的解决方案..之前没见过 (5认同)
  • @Wraith,你不需要插件.它只是`window.location.pathname`. (3认同)
  • 从您的网址中获取奇怪的内容.或者,换句话说,"将您的查询字符串更改为仅使用有效的UTF-8字符".:)仅F8不是有效的UTF-8字符. (2认同)
  • @MattNorris你不需要一个插件,但正确答案是:window.location.host + window.location.pathname在你的情况下它将是"www.youtube.com/watch" (2认同)

red*_*are 62

Ben Alman 在这里有一个很好的jquery查询字符串/ url插件,可以让你轻松操作查询字符串.

按照要求 -

GOTO他的测试页在这里

在firebug中,将以下内容输入控制台

jQuery.param.querystring(window.location.href, 'a=3&newValue=100');

它将返回以下修改的url字符串

http://benalman.com/code/test/js-jquery-url-querystring.html?a=3&b=Y&c=Z&newValue=100#n=1&o=2&p=3

请注意,a的查询字符串值已从X更改为3,并且已添加新值.

然后,您可以使用新的url字符串,例如使用document.location = newUrl或更改锚链接等

  • `TypeError:jQuery.param.querystring不是函数` (12认同)
  • 是不是jQuery.param.querystring而不是jQuery.queryString? (4认同)
  • 你应该调用`jQuery.param.querystring`.我猜他们已经重构了这个库. (2认同)

Sin*_*hus 61

4年后,在学到了很多东西之后回答我自己的问题.特别是你不应该使用jQuery.我创建了一个可以解析/字符串化查询字符串的简单模块.这样可以轻松修改查询字符串.

您可以使用query-string,如下所示:

// parse the query string into an object
var q = queryString.parse(location.search);
// set the `row` property
q.rows = 10;
// convert the object to a query string
// and overwrite the existing query string
location.search = queryString.stringify(q);
Run Code Online (Sandbox Code Playgroud)

  • jQuery 对于 1 个函数来说太多了,因此您使用了 typescript、travis 和其他几个非开发依赖项:) (4认同)
  • 为此拥有一个额外的库似乎有点额外...... (2认同)
  • @SindreSorhus 这有点轻松,但我认为正确看待这些事情的复杂性很重要。如果你觉得这没有建设性,那就同上。 (2认同)

bro*_*son 57

纯js的快速小解决方案,无需插件:

function replaceQueryParam(param, newval, search) {
    var regex = new RegExp("([?;&])" + param + "[^&;]*[;&]?");
    var query = search.replace(regex, "$1").replace(/&$/, '');

    return (query.length > 2 ? query + "&" : "?") + (newval ? param + "=" + newval : '');
}
Run Code Online (Sandbox Code Playgroud)

像这样称呼它:

 window.location = '/mypage' + replaceQueryParam('rows', 55, window.location.search)
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要保持在同一页面并替换多个参数:

 var str = window.location.search
 str = replaceQueryParam('rows', 55, str)
 str = replaceQueryParam('cols', 'no', str)
 window.location = window.location.pathname + str
Run Code Online (Sandbox Code Playgroud)

编辑,谢谢卢克:要完全删除参数,传递falsenull为值:replaceQueryParam('rows', false, params).既然0 也是假的,请注明'0'.

  • 还要从输出中删除一个used参数执行此操作:str = replaceQueryParam('oldparam',false,str) - 基本上放置一个false类型值 (2认同)

Ali*_*ter 30

一种现代的方法是使用基于原生标准的URLSearchParams.它是由所有主流浏览器的支持,除了IE他们polyfills其中可用

const paramsString = "site.fwx?position=1&archiveid=5000&columns=5&rows=20&sorting=ModifiedTimeAsc"
const searchParams = new URLSearchParams(paramsString);
searchParams.set('rows', 10);
console.log(searchParams.toString()); // return modified string.
Run Code Online (Sandbox Code Playgroud)

  • @Alister你的答案有一个错误,`new URLSearchParams("site.fwx?position=1&amp;...`应该是`new URLSearchParams("position=1&amp;...`)(它只接受搜索字符串,而不是路径好吧)。我已编辑修复,但编辑被拒绝?还有 @the-godfather `const searchParams = new URLSearchParams(location.search); searchParams.set('rows', 10); location.search = searchParams; ` 是您在此答案中想要的额外信息。 (3认同)
  • 这也对原始 paramsString 进行了完整的 urlencode,所以结果看起来像`site.fwx%3Fposition=1&amp;archiveid=5000&amp;columns=5&amp;rows=10&amp;sorting=ModifiedTimeAsc`,这很令人困惑,因为如果你手动完成它不是你会构建的...... (2认同)

Pos*_*sto 27

你也可以通过普通的JS来做到这一点

var url = document.URL
var newAdditionalURL = "";
var tempArray = url.split("?");
var baseURL = tempArray[0];
var aditionalURL = tempArray[1]; 
var temp = "";
if(aditionalURL)
{
var tempArray = aditionalURL.split("&");
for ( var i in tempArray ){
    if(tempArray[i].indexOf("rows") == -1){
            newAdditionalURL += temp+tempArray[i];
                temp = "&";
            }
        }
}
var rows_txt = temp+"rows=10";
var finalURL = baseURL+"?"+newAdditionalURL+rows_txt;
Run Code Online (Sandbox Code Playgroud)


Tje*_*rkW 13

这是更改URL参数的现代方法:

function setGetParam(key,value) {
  if (history.pushState) {
    var params = new URLSearchParams(window.location.search);
    params.set(key, value);
    var newUrl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?' + params.toString();
    window.history.pushState({path:newUrl},'',newUrl);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • “Internet Explorer 将于 2022 年 6 月 15 日停用” https://blogs.windows.com/windowsexperience/2021/05/19/the-future-of-internet-explorer-on-windows-10-is-in-微软边缘/ (4认同)
  • Internet Explorer 11 目前不支持此解决方案:https://caniuse.com/#search=URLSearchParams (2认同)

Har*_*ime 10

String操作的可行替代方法是设置html form并只修改rows元素的值吗?

所以,html就像这样

<form id='myForm' target='site.fwx'>
    <input type='hidden' name='position' value='1'/>
    <input type='hidden' name='archiveid' value='5000'/>
    <input type='hidden' name='columns' value='5'/>
    <input type='hidden' name='rows' value='20'/>
    <input type='hidden' name='sorting' value='ModifiedTimeAsc'/>
</form>
Run Code Online (Sandbox Code Playgroud)

用以下JavaScript提交表单

var myForm = document.getElementById('myForm');
myForm.rows.value = yourNewValue;
myForm.submit();
Run Code Online (Sandbox Code Playgroud)

可能不适合所有情况,但可能比解析URL字符串更好.


Onk*_*kar 10

使用URLSearchParamscheckget并且set参数值成URL

这是获取当前 URL 并设置新参数并根据需要更新 URL 或重新加载页面的示例

var rows = 5; // value that you want to set
var url = new URL(window.location);
(url.searchParams.has('rows') ? url.searchParams.set('rows', rows) : url.searchParams.append('rows', rows));

// if you want to append into URL without reloading the page
url.search = url.searchParams;
url        = url.toString();
history.pushState({}, null, url);

// want to reload the window with new param
window.location = url;
Run Code Online (Sandbox Code Playgroud)


Alp*_*glu 9

2020 解决方案:如果传递null或传递undefined值,则设置变量或删除 iti 。

var setSearchParam = function(key, value) {
    if (!window.history.pushState) {
        return;
    }

    if (!key) {
        return;
    }

    var url = new URL(window.location.href);
    var params = new window.URLSearchParams(window.location.search);
    if (value === undefined || value === null) {
        params.delete(key);
    } else {
        params.set(key, value);
    }

    url.search = params;
    url = url.toString();
    window.history.replaceState({url: url}, null, url);
}
Run Code Online (Sandbox Code Playgroud)

  • 即使它开始受到支持,在这个问题中,与 URLSearchParams 相同的答案已经被回答了至少 3 次,分别于 2017 年 1 月 15 日 15:24 回答、2018 年 6 月 14 日 15:54 回答、以及 2019 年 3 月 1 日回答12:46 ,就好像你们发帖前没有人阅读回复一样 (2认同)

War*_*ula 8

可以使用 URLSearchParams 和 History 接口轻松修改 URL 查询参数:

// Construct URLSearchParams object instance from current URL querystring.
var queryParams = new URLSearchParams(window.location.search);
 
// Set new or modify existing parameter value. 
//queryParams.set("myParam", "myValue");
queryParams.set("rows", "10");
 
// Replace current querystring with the new one.
history.replaceState(null, null, "?"+queryParams.toString());
Run Code Online (Sandbox Code Playgroud)

或者,我们可以使用 pushState() 方法创建一个新的,而不是使用 replaceState() 修改当前历史条目:

history.pushState(null, null, "?"+queryParams.toString());
Run Code Online (Sandbox Code Playgroud)

https://zgadzaj.com/development/javascript/how-to-change-url-query-parameter-with-javascript-only


小智 7

您可以使用我的库来完成这项工作:https://github.com/Mikhus/jsurl

var url = new Url('site.fwx?position=1&archiveid=5000&columns=5&rows=20&sorting=ModifiedTimeAsc');
url.query.rows = 10;
alert( url);
Run Code Online (Sandbox Code Playgroud)


spr*_*tex 5

考虑这个:

const myUrl = new URL("http://www.example.com?columns=5&rows=20");
myUrl.searchParams.set('rows', 10);
console.log(myUrl.href); // http://www.example.com?columns=5&rows=10
myUrl.searchParams.set('foo', 'bar'); // add new param
console.log(myUrl.href); // http://www.example.com?columns=5&rows=10&foo=bar
Run Code Online (Sandbox Code Playgroud)

它会做你需要的完全一样的事情。请注意 URL 必须具有正确的格式。在您的示例中,您必须指定协议(httphttps