更改网址参数

时间:2009-07-07 08:05:03

标签: javascript url query-string url-parameters url-parsing

我有这个网址:

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

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

30 个答案:

答案 0 :(得分:98)

我已经扩展了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;
}

函数调用:

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

window.history.replaceState('', '', updateURLParameter(window.location.href, "param", "value"));

更新版本,同时处理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;
}

答案 1 :(得分:88)

我想你想要query plugin

E.g:

window.location.search = jQuery.query.set("rows", 10);

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

答案 2 :(得分:62)

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

按要求 -

转到他的测试页here

在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,并且已添加新值。

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

答案 3 :(得分:59)

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

答案 4 :(得分:54)

纯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 : '');
}

这样称呼:

 window.location = '/mypage' + replaceQueryParam('rows', 55, window.location.search)

或者,如果你想留在同一页面上并替换多个参数:

 var str = window.location.search
 str = replaceQueryParam('rows', 55, str)
 str = replaceQueryParam('cols', 'no', str)
 window.location = window.location.pathname + str

编辑,感谢Luke:要完全删除参数,请将falsenull传递给值:replaceQueryParam('rows', false, params)。自0 is also falsy起,请指定'0'

答案 5 :(得分: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;

答案 6 :(得分:26)

现代方法是使用基于原生标准的URLSearchParams。它受到所有主流浏览器的支持,除了IE,它们是polyfills available

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.

答案 7 :(得分:10)

字符串操作的可行替代方法是设置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>

使用以下JavaScript提交表单

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

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

答案 8 :(得分:6)

您可以使用我的库来完成这项工作: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);

答案 9 :(得分:5)

我认为我们使用 URLSearchParamsgetset 参数值转化为 href

这里是获取当前 URL 并设置参数 test 的值的示例

let newUrl = new URL(window.location.href);
let params = new URLSearchParams(newUrl.search);
params.set('test', testValue);
newUrl.search = params;
newUrl        = newUrl.toString();
history.pushState({}, null, newUrl);

答案 10 :(得分:5)

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

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

答案 11 :(得分:4)

考虑这个:

<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

它会做你需要的完全一样的事情。请注意 URL 必须具有正确的格式。在您的示例中,您必须指定协议(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 http

答案 12 :(得分:3)

我写了一个小帮手函数,适用于任何选择。您需要做的就是将“redirectOnChange”类添加到任何select元素,这将导致页面使用新的/更改的querystring参数重新加载,该参数等于select的id和value,例如:

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

上面的例子会添加“?myValue = 222”或“?myValue = 333”(如果存在其他参数,则使用“&amp;”),然后重新加载页面。

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

答案 13 :(得分:3)

可以使用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()修改当前历史记录条目:

history.pushState(null, null, "?"+queryParams.toString());

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

答案 14 :(得分: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){
  // http://stackoverflow.com/a/10997390/2391566
  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;
  }
}

答案 15 :(得分:2)

使用 javascript 网址:

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

答案 16 :(得分:1)

这是使用query-string库的简单解决方案。

const qs = require('query-string')
function addQuery(key, value) {
  const q = qs.parse(location.search)
  const url = qs.stringifyUrl(
    {
      url: location.pathname,
      query: {
      ...q,
      [key]: value,
      },
    },
    { skipEmptyString: true }
  );
  window.location.href = url
  // if you are using Turbolinks
  // add this: Turbolinks.visit(url)
}
// Usage
addQuery('page', 2)

如果您使用的是react,而没有react-router

export function useAddQuery() {
  const location = window.location;
  const addQuery = useCallback(
    (key, value) => {
      const q = qs.parse(location.search);
      const url = qs.stringifyUrl(
        {
          url: location.pathname,
          query: {
            ...q,
            [key]: value,
          },
        },
        { skipEmptyString: true }
      );
      window.location.href = url
    },
    [location]
  );

  return { addQuery };
}
// Usage
const { addQuery } = useAddQuery()
addQuery('page', 2)

如果您将reactreact-router一起使用

export function useAddQuery() {
  const location = useLocation();
  const history = useHistory();

  const addQuery = useCallback(
    (key, value) => {
      let pathname = location.pathname;
      let searchParams = new URLSearchParams(location.search);
      searchParams.set(key, value);
      history.push({
        pathname: pathname,
        search: searchParams.toString()
      });
    },
    [location, history]
  );

  return { addQuery };
}

// Usage
const { addQuery } = useAddQuery()
addQuery('page', 2)

PS qs是从query-string模块导入的。

答案 17 :(得分:0)

我也写了library for getting and setting URL query parameters in JavaScript

以下是其用法示例。

var url = Qurl.create()
  , query
  , foo
  ;

将查询参数作为对象,按键或添加/更改/删除。

// returns { foo: 'bar', baz: 'qux' } for ?foo=bar&baz=qux
query = url.query();

// get the current value of foo
foo = url.query('foo');

// set ?foo=bar&baz=qux
url.query('foo', 'bar');
url.query('baz', 'qux');

// unset foo, leaving ?baz=qux
url.query('foo', false); // unsets foo

答案 18 :(得分:0)

我的解决方案:

const setParams = (data) => {
    if (typeof data !== 'undefined' && typeof data !== 'object') {
        return
    }

    let url = new URL(window.location.href)
    const params = new URLSearchParams(url.search)

    for (const key of Object.keys(data)) {
        if (data[key] == 0) {
            params.delete(key)
        } else {
            params.set(key, data[key])
        }
    }

    url.search = params
    url = url.toString()
    window.history.replaceState({ url: url }, null, url)
}

然后只需调用“ setParams”,然后向对象传递您要设置的数据即可。

示例:

$('select').on('change', e => {
    const $this = $(e.currentTarget)
    setParams({ $this.attr('name'): $this.val() })
})

就我而言,当它更改时,我不得不更新html select输入,如果值是“ 0”,请删除该参数。如果对象键也为“ null”,则可以编辑函数并从url中删除参数。

希望对您有帮助

答案 19 :(得分:0)

无库,使用URL()WebAPI(https://developer.mozilla.org/en-US/docs/Web/API/URL

function setURLParameter(url, parameter, value) {
    let url = new URL(url);
    if (url.searchParams.get(parameter) === value) {
        return url;
    }
    url.searchParams.set(parameter, value);
    return url.href;
}

这不适用于IE:https://developer.mozilla.org/en-US/docs/Web/API/URL#Browser_compatibility

答案 20 :(得分:0)

如果要更改地址栏中的网址:

const search = new URLSearchParams(location.search);
search.set('rows', 10);
location.search = search.toString();

请注意,更改location.search将重新加载页面。

答案 21 :(得分:0)

Sujoy回答的另一个变种。刚刚更改了变量名称&amp;添加了命名空间包装器:

window.MyNamespace = window.MyNamespace  || {};
window.MyNamespace.Uri = window.MyNamespace.Uri || {};

(function (ns) {

    ns.SetQueryStringParameter = function(url, parameterName, parameterValue) {

        var otherQueryStringParameters = "";

        var urlParts = url.split("?");

        var baseUrl = urlParts[0];
        var queryString = urlParts[1];

        var itemSeparator = "";
        if (queryString) {

            var queryStringParts = queryString.split("&");

            for (var i = 0; i < queryStringParts.length; i++){

                if(queryStringParts[i].split('=')[0] != parameterName){

                    otherQueryStringParameters += itemSeparator + queryStringParts[i];
                    itemSeparator = "&";
                }
            }
        }

        var newQueryStringParameter = itemSeparator + parameterName + "=" + parameterValue;

        return baseUrl + "?" + otherQueryStringParameters + newQueryStringParameter;
    };

})(window.MyNamespace.Uri);

现在使用:

var changedUrl = MyNamespace.Uri.SetQueryStringParameter(originalUrl, "CarType", "Ford");

答案 22 :(得分:0)

我一直在寻找同样的东西,并发现:https://github.com/medialize/URI.js非常好:)

- 更新

我找到了一个更好的软件包:https://www.npmjs.org/package/qs它还处理get params中的数组。

答案 23 :(得分:0)

这是我的工作。使用我的editParams()函数,您可以添加,删除或更改任何参数,然后使用内置的replaceState()函数来更新URL:

window.history.replaceState('object or string', 'Title', 'page.html' + editParams('sorting', ModifiedTimeAsc));


// background functions below:

// add/change/remove URL parameter
// use a value of false to remove parameter
// returns a url-style string
function editParams (key, value) {
  key = encodeURI(key);

  var params = getSearchParameters();

  if (Object.keys(params).length === 0) {
    if (value !== false)
      return '?' + key + '=' + encodeURI(value);
    else
      return '';
  }

  if (value !== false)
    params[key] = encodeURI(value);
  else
    delete params[key];

  if (Object.keys(params).length === 0)
    return '';

  return '?' + $.map(params, function (value, key) {
    return key + '=' + value;
  }).join('&');
}

// Get object/associative array of URL parameters
function getSearchParameters () {
  var prmstr = window.location.search.substr(1);
  return prmstr !== null && prmstr !== "" ? transformToAssocArray(prmstr) : {};
}

// convert parameters from url-style string to associative array
function transformToAssocArray (prmstr) {
  var params = {},
      prmarr = prmstr.split("&");

  for (var i = 0; i < prmarr.length; i++) {
    var tmparr = prmarr[i].split("=");
    params[tmparr[0]] = tmparr[1];
  }
  return params;
}

答案 24 :(得分:-1)

我的功能支持删除参数

pip install <file name>

答案 25 :(得分:-1)

我的带有URI解码/编码的代码段:

function isDefined(object) {
	return object !== undefined && object !== null;
}

function isNotEmpty(string) {
	return isDefined(string) && string.length > 0;
}

/**
 * Update or add the specified URL parameter.
 * <p>
 * @param {String} name
 * @param {String} value
 */
function updateUrlParam(name, value) {
	// Get the path and the query
	var urlInfo = decodeURI(window.location.href).split('?');
	var path = urlInfo[0];
	var query = urlInfo[1];

	// Build the query
	var params = '';
	var anchor = null;
	if (isNotEmpty(query)) {
		var queryInfo = query.split('#');
		query = queryInfo[0];
		anchor = queryInfo[1];

		queryInfo = query.split('&');
		for (var i = 0; i < queryInfo.length; ++i) {
			if (queryInfo[i].split('=')[0] !== name) {
				params += '&' + queryInfo[i];
			}
		}
	} else {
		var queryInfo = path.split('#');
		query = queryInfo[0];
		anchor = queryInfo[1];
		if (isNotEmpty(query)) {
			path = query;
		}
	}
	query = '?' + name + '=' + value + params;
	if (isNotEmpty(anchor)) {
		query += '#' + anchor;
	}

	// Replace the URL
	window.history.replaceState('', '', encodeURI(path + query));
}

答案 26 :(得分:-1)

JMeter

答案 27 :(得分:-1)

2019解决方案:如果将nullundefined传递给该值,则设置变量或删除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);
}

答案 28 :(得分:-1)

我刚刚编写了一个简单的模块来处理读取和更新当前的url查询参数。

用法示例:

import UrlParams from './UrlParams'

UrlParams.remove('foo') //removes all occurences of foo=?
UrlParams.set('foo', 'bar') //set all occurences of foo equal to bar
UrlParams.add('foo', 'bar2') //add bar2 to foo result: foo=bar&foo=bar2
UrlParams.get('foo') //returns bar
UrlParams.get('foo', true) //returns [bar, bar2]

这是我的代码,名为UrlParams。(js / ts):

class UrlParams {

    /**
     * Get params from current url
     * 
     * @returns URLSearchParams
     */
    static getParams(){
        let url = new URL(window.location.href)
        return new URLSearchParams(url.search.slice(1))
    }

    /**
     * Update current url with params
     * 
     * @param params URLSearchParams
     */
    static update(params){
        if(`${params}`){
            window.history.replaceState({}, '', `${location.pathname}?${params}`)
        } else {
            window.history.replaceState({}, '', `${location.pathname}`)
        }
    }

    /**
     * Remove key from url query
     * 
     * @param param string
     */
    static remove(param){
        let params = this.getParams()
        if(params.has(param)){
            params.delete(param)
            this.update(params)
        }
    }

    /**
     * Add key value pair to current url
     * 
     * @param key string
     * @param value string
     */
    static add(key, value){
        let params = this.getParams()
        params.append(key, value)
        this.update(params)
    }

    /**
     * Get value or values of key
     * 
     * @param param string
     * @param all string | string[]
     */
    static get(param, all=false){
        let params = this.getParams()
        if(all){
            return params.getAll(param)
        }
        return params.get(param)
    }

    /**
     * Set value of query param
     * 
     * @param key string
     * @param value string
     */
    static set(key, value){
        let params = this.getParams()
        params.set(key, value)
        this.update(params)
    }

}
export default UrlParams
export { UrlParams }

答案 29 :(得分:-1)

我知道这是一个老问题。我已经增强了上面的功能来添加或更新查询参数。仍然只是纯粹的JS解决方案。

                      function addOrUpdateQueryParam(param, newval, search) {

                        var questionIndex = search.indexOf('?');

                        if (questionIndex < 0) {
                            search = search + '?';
                            search = search + param + '=' + newval;
                            return search;
                        }

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

                        var indexOfEquals = query.indexOf('=');

                        return (indexOfEquals >= 0 ? query + '&' : query + '') + (newval ? param + '=' + newval : '');
                    }