使用JavaScript更改URL参数并指定默认值

243

我有这个 URL:

site.fwx?position=1&archiveid=5000&columns=5&rows=20&sorting=ModifiedTimeAsc

我需要做的是能够更改“rows”URL参数的值为我指定的值,比如说10。如果“rows”不存在,我需要将其添加到URL末尾,并添加我已经指定的值(10)。


13
我很难相信现在已经是2013年了,还没有更好的方法来做到这一点,比如将其构建到核心浏览器库中。 - Tyler Collier
8
@TylerCollier 中2015年至今仍然没有任何进展 :( - Tejas Manohar
4
看起来我们已经接近目标了... https://developer.mozilla.org/zh-CN/docs/Web/API/URLSearchParams/URLSearchParams#浏览器兼容性 - chris
13
@TylerCollier 现在是2021年,我们终于搞定了 :) const myUrl = new URL("http://www.example.com?columns=5&rows=20"); myUrl.searchParams.set('rows', 10); myUrl.href 将包含更新后的URL - sprutex
2
根据@sprutex的评论,您可以将http://www.example.com?columns=5&rows=20替换为window.location.href以使代码更具动态性。 - Waleed Khaled
显示剩余5条评论
32个回答

10

除了字符串操作之外,设置一个HTML表单并修改“行(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>

使用以下JavaScript提交表单

var myForm = document.getElementById('myForm');
myForm.rows.value = yourNewValue;
myForm.submit();

可能不适用于所有情况,但比解析URL字符串更好看。


那是个聪明的做法。 - icarito

10

使用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());

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

Alternatively instead of modifying current history entry using replaceState() we can use pushState() method to create a new one:
history.pushState(null, null, "?"+queryParams.toString());

如何使用JavaScript仅更改URL查询参数


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

7

请考虑以下内容:

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

它将会执行你所需的完全相同的操作。请注意URL必须具有正确的格式。在你的示例中,你必须指定协议(要么是http,要么是https)。


3

使用JavaScript URL:

var url = new URL(window.location);
(url.searchParams.has('rows') ? url.searchParams.set('rows', rows) : url.searchParams.append('rows', rows));
window.location = url;

3
var url = new URL(window.location.href);
var search_params = url.searchParams;
search_params.set("param", value);
url.search = search_params.toString();
var new_url = url.pathname + url.search;
window.history.replaceState({}, '', new_url);

3
URLSearchParams文档中,有一种非常简洁的方法可以实现此操作,而不会影响历史记录堆栈。
// URL: https://example.com?version=1.0
const params = new URLSearchParams(location.search);
params.set('version', 2.0);

window.history.replaceState({}, '', `${location.pathname}?${params}`);
// URL: https://example.com?version=2.0

同样地,要删除一个参数。
params.delete('version')
window.history.replaceState({}, '', `${location.pathname}?${params}`);
// URL: https://example.com?

3

我写了一个小的辅助函数,可以与任何选择器一起使用。您只需要将类“redirectOnChange”添加到任何选择器元素中,这将导致页面重新加载一个新的/更改的查询字符串参数,等于选择器的id和值,例如:

<select id="myValue" class="redirectOnChange"> 
    <option value="222">test222</option>
    <option value="333">test333</option>
</select>

上面的示例会添加 "?myValue=222" 或 "?myValue=333"(如果有其他参数则使用 "&"),并重新加载页面。
jQuery:
$(document).ready(function () {

    //Redirect on Change
    $(".redirectOnChange").change(function () {
        var href = window.location.href.substring(0, window.location.href.indexOf('?'));
        var qs = window.location.href.substring(window.location.href.indexOf('?') + 1, window.location.href.length);
        var newParam = $(this).attr("id") + '=' + $(this).val();

        if (qs.indexOf($(this).attr("id") + '=') == -1) {
            if (qs == '') {
                qs = '?'
            }
            else {
                qs = qs + '&'
            }
            qs = qs + newParam;

        }
        else {
            var start = qs.indexOf($(this).attr("id") + "=");
            var end = qs.indexOf("&", start);
            if (end == -1) {
                end = qs.length;
            }
            var curParam = qs.substring(start, end);
            qs = qs.replace(curParam, newParam);
        }
        window.location.replace(href + '?' + qs);
    });
});

迄今为止,这个页面上最好的解决方案 - ed209

2

这里我采用了Adil Malik的答案,并修复了我发现的3个问题。

/**
 * Adds or updates a URL parameter.
 *
 * @param {string} url  the URL to modify
 * @param {string} param  the name of the parameter
 * @param {string} paramVal  the new value for the parameter
 * @return {string}  the updated URL
 */
self.setParameter = function (url, param, paramVal){
  // https://dev59.com/enNA5IYBdhLWcg3wGJ0V#10997390
  var parts = url.split('?');
  var baseUrl = parts[0];
  var oldQueryString = parts[1];
  var newParameters = [];
  if (oldQueryString) {
    var oldParameters = oldQueryString.split('&');
    for (var i = 0; i < oldParameters.length; i++) {
      if(oldParameters[i].split('=')[0] != param) {
        newParameters.push(oldParameters[i]);
      }
    }
  }
  if (paramVal !== '' && paramVal !== null && typeof paramVal !== 'undefined') {
    newParameters.push(param + '=' + encodeURI(paramVal));
  }
  if (newParameters.length > 0) {
    return baseUrl + '?' + newParameters.join('&');
  } else {
    return baseUrl;
  }
}

2

let url= new URL("https://example.com/site.fwx?position=1&archiveid=5000&columns=5&rows=20&sorting=ModifiedTimeAsc")
url.searchParams.set('rows', 10)
console.log(url.toString())


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接