Изменить параметры URL


189

У меня есть этот URL:

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

мне нужно иметь возможность изменить значение параметра url «строки» на то, что я указываю, скажем, 10. И если «строк» ​​не существует, мне нужно добавить его в конец URL и добавить значение, которое я уже указал (10).



11
Я не могу поверить, что это 2013 год, и нет лучшего способа сделать это, как что-то встроенное в основные библиотеки браузеров.
Тайлер Кольер

Смотрите мой ответ для современного решения: stackoverflow.com/a/19965480/64949
Синдре Сорхус

6
@TylerCollier середина 2015 года сейчас и до сих пор ничего :(
Теджас Манохар

3
Похоже, мы
Крис

Ответы:


111

Я расширил код 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;
}

Я не могу заставить это работать. Вот мой код: jsfiddle.net/Draven/tTPYL/1 URL-адрес будет выглядеть так, http://www.domain.com/index.php?action=my_action&view-all=Yesи мне нужно изменить значение «view-all». Мой SO вопрос, который был закрыт: stackoverflow.com/questions/13025880/…
Draven

Ты уверен? это сработало для меня легко. Проверьте это здесь: jsfiddle.net/mw49a
Адил Малик

1
Используйте «var i = 0» вместо «i = 0», чтобы предотвратить создание / изменение i как глобальной переменной.
Джонатан Акино

1
Пара других проблем с этой функцией: (1) paramVal не кодируется URI. (2) если paramVal равен нулю, тогда вы получите foo = null. Это должно быть foo = (или даже лучше, удалить foo полностью).
Джонатан Акино

Это сделало мою жизнь намного проще. Большое спасибо друг!
boydenhartog

97

Я думаю, что вы хотите плагин запроса .

Например:

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

Это будет работать независимо от текущего состояния строк.


Более того, это потому, что плагин Query использует decodeURIComponent, а decodeURIComponent ("% F8") недопустим.
Мэтью Флэшен

2
Получите эти странные вещи из вашего URL. Или, другими словами, «измените строку запроса, чтобы использовать только допустимые символы UTF-8». :) Только F8 не является действительным символом UTF-8.
Мэтью Флэшен

Есть ли способ получить базовый URL из этого плагина? Например, если мой URL-адрес « youtube.com/watch?v=PZootaxRh3M », получите « youtube.com/watch »
Мэтт Норрис

3
@ Wraith, вам не нужен плагин для этого. Это просто window.location.pathname.
Мэттью Флашен

2
@MattNorris Вам не нужен плагин для этого, но правильный ответ: window.location.host + window.location.pathname В вашем случае это будет «www.youtube.com/watch»
nktssh

68

Чтобы ответить на мой собственный вопрос 4 года спустя, после того, как многому научился. Тем более, что вы не должны использовать jQuery для всего. Я создал простой модуль, который может анализировать / структурировать строку запроса. Это позволяет легко изменить строку запроса.

Вы можете использовать строку запроса следующим образом:

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

1
Вау, это блестяще простое решение. Спасибо!
Джетлей

Это работает как чемпион! Спасибо, Синдре 🏆🏆🏆 (все, что тебе нужно сделать, это минимизировать «query-string / index.js» и вставить его внизу своего js)
Ронни Ройстон,

1
Наличие дополнительной библиотеки только для этого кажется немного лишним ...
Крестный отец

jQuery было слишком много для одной функции, поэтому вместо этого вы использовали машинописный текст, travis и несколько других не-dev зависимостей :)
Джастин Майнерс,

@JustinMeiners Пожалуйста, не комментируйте, если у вас нет ничего полезного для обсуждения. TypeScript не используется этим проектом. Трэвис - это КИ, а не зависимость.
Синдре Сорхус

64

Быстрое небольшое решение в чистом 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

редактировать, благодаря Люку: Чтобы удалить параметр целиком, передать falseили nullдля значения: replaceQueryParam('rows', false, params). Так как 0 это тоже ложь , уточняйте '0'.


2
также, чтобы удалить используемый параметр из выходных данных, сделайте это: str = replaceQueryParam ('oldparam', false, str) - в основном поместите значение ложного типа
Люк Венке

1
есть проблема, дублирование моего параметра без уважительной причины, проверьте это похожее решение stackoverflow.com/a/20420424/3160597
azerafati

@Bludream, этот код работает в производстве в течение многих лет. Я еще не видел, чтобы это дублировало параметр. Можете ли вы опубликовать репродукцию или более конструктивную информацию?
бронсон

@Bludream Теперь я понимаю, это сценарий, на который вы ссылались, который добавляет дубликаты параметров. :)
бронсон

1
@dVyper правильно, ложное значение полностью удаляет параметр. Используйте текст '0' вместо целого числа 0.
bronson

62

Бен Алман имеет хороший плагин jquery querystring / url здесь , что позволяет манипулировать строку запроса легко.

Как просили -

Перейти на его тестовую страницу здесь

В 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 или изменить ссылку привязки и т. Д.


4
Разве это не jQuery.param.querystring вместо jQuery.queryString?
Петр Пеллер

12
TypeError: jQuery.param.querystring is not a function
TMS

1
Чтобы избежать 'TypeError', это должно быть: jQuery.queryString (window.location.href, 'a = 3 & newValue = 100')
code-gijoe

2
ты должен позвонить jQuery.param.querystring. Я думаю, они реорганизовали библиотеку.
Будет Ву

Ни одна из этих функций больше не существует. Вы хотите обновить window.location.search вручную. Это становится сложнее, если вы не хотите, чтобы страница перерисовывалась, так как это приведет к изменению страницы.
монокром

39

Современный подход к этому состоит в использовании нативного стандартного URLSearchParams . Он поддерживается всеми основными браузерами, кроме IE, где доступны полифиллы.

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.

1
Было бы очень хорошо ... но это не так, как IE не поддерживает его вообще, и использование polyfills для такой мелочи совершенно исключено.
Форсберг

1
это также полностью кодирует исходную строку paramsString, поэтому результат выглядит как-то site.fwx%3Fposition=1&archiveid=5000&columns=5&rows=10&sorting=ModifiedTimeAscнепонятно, потому что это не то, что вы бы построили, если бы делали это вручную ...
Бен Уилер,

1
Было бы неплохо увидеть пример того, как его использовать. Я имею в виду, как получить строку параметров с текущей страницы и как установить ее потом
Крестный отец

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;

Ницца! Я взял это и изменил в функцию. Вы отправляете текущий URL-адрес, имя параметра, который вы ищете, новое значение и логическое значение, сообщающее, хотите ли вы добавить параметр в строку запроса, если я не нашел его там в настоящее время. Функция возвращает измененный URL.
Громер

Gormer, ты должен поделиться этой функцией с другими :)
Адиль Малик

Потрясающий фрагмент. Я тоже превратил его в функцию для собственного варианта использования. Спасибо, что поделился! +1
robabby

19

Это современный способ изменить параметры 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);
  }
}

2
Это решение в настоящее время не поддерживается в Internet Explorer 11: caniuse.com/#search=URLSearchParams
WoIIe

@Alister ответил вам за пол года до того же ответа
FantomX1

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.


Это умный.
Икарито

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

4

Решение 2020 : устанавливает переменную или удаляет iti, если вы передаете nullили undefinedзначение.

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

Обратите внимание, что URLSearchParams не работает в последних версиях всех основных браузеров (2020)
Оливер Шиммер


Он поддерживается во всех основных браузерах, кроме IE11: caniuse.com/#search=URLSearchParams
Луис Пауло Ломанн

Даже если это начало поддерживаться, тот же ответ с URLSearchParams был дан ответ на этот вопрос, по крайней мере, 3 раза уже на ответ от 15 января 17 в 15:24, ответил 14 июня 18 в 15:54 и ответил 1 марта 19 в 12:46, как будто никто из вас не читал ответы перед публикацией
FantomX1

все сообщения имеют незначительные проблемы, которые необходимо решить. так что пусть пользователи голосуют и выбирают лучшего.
Альпер Эбикоглу

3

Я написал небольшую вспомогательную функцию, которая работает с любым выбором. Все, что вам нужно сделать, это добавить класс "redirectOnChange" к любому элементу select, и это приведет к перезагрузке страницы с новым / измененным параметром строки запроса, равным id и значению select, например:

<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

Здесь я взял ответ Адиля Малика и исправил 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;
  }
}

1

Вот что я делаю. Используя мою функцию 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;
}

Понижение без комментариев? Что не так с кодом? Это работает фантастически для многих ситуаций.
Bobb Fwed

1

Мое решение:

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», удалить параметр. Вы можете отредактировать функцию и удалить параметр из URL, если ключ объекта также имеет значение «null».

Надеюсь, это поможет вам


перед вами уже есть 2 одинаковых ответа с URLSearchParams, как будто никто из вас действительно не читает ответы. Написал ответил 15 января 17 в 15:24, ответил 14 июня 18 в 15:54
FantomX1

0

Еще один вариант ответа Суйой. Просто изменили имена переменных и добавили оболочку пространства имен:

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

0

Я тоже написал библиотеку для получения и установки параметров запроса URL в 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


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

-1

моя функция поддерживает удаление параметров

function updateURLParameter(url, param, paramVal, remove = false) {
        var newAdditionalURL = '';
        var tempArray = url.split('?');
        var baseURL = tempArray[0];
        var additionalURL = tempArray[1];
        var rows_txt = '';

        if (additionalURL)
            newAdditionalURL = decodeURI(additionalURL) + '&';

        if (remove)
            newAdditionalURL = newAdditionalURL.replace(param + '=' + paramVal, '');
        else
            rows_txt = param + '=' + paramVal;

        window.history.replaceState('', '', (baseURL + "?" + newAdditionalURL + rows_txt).replace('?&', '?').replace('&&', '&').replace(/\&$/, ''));
    }

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

Уже есть 4 таких же ответа, о которых вы упомянули, опубликованных: ответ от 15 января 17 в 15:24, ответ от 14 июня 18 в 15:54, ответ от 1 марта 19 в 12:46 и от 14 июня 19 в 7: 20, как будто никто из вас не прочитал ответы перед публикацией
FantomX1

-2
     // usage: clear ; cd src/js/node/js-unit-tests/01-set-url-param ; npm test ; cd -
     // prereqs: , nodejs , mocha
     // URI = scheme:[//authority]path[?paramName1=paramValue1&paramName2=paramValue2][#fragment]
     // call by: uri = uri.setUriParam("as","md")
     String.prototype.setUriParam = function (paramName, paramValue) {
        var uri = this
        var fragment = ( uri.indexOf('#') === -1 ) ? '' : uri.split('#')[1]
        uri = ( uri.indexOf('#') === -1 ) ? uri : uri.split('#')[0]
        if ( uri.indexOf("?") === -1 ) { uri = uri + '?&' }
        uri = uri.replace ( '?' + paramName , '?&' + paramName)
        var toRepl = (paramValue != null) ? ('$1' + paramValue) : ''
        var toSrch = new RegExp('([&]' + paramName + '=)(([^&#]*)?)')
        uri = uri.replace(toSrch,toRepl)
        if (uri.indexOf(paramName + '=') === -1 && toRepl != '' ) {
           var ampersandMayBe = uri.endsWith('&') ? '' : '&'
           uri = uri + ampersandMayBe + paramName + "=" + String(paramValue)
        }
        uri = ( fragment.length == 0 ) ? uri : (uri+"#"+fragment) //may-be re-add the fragment
        return uri
     }

     var assert = require('assert');
     describe('replacing url param value', function () {

        // scheme://authority/path[?p1=v1&p2=v2#fragment
        // a clean url
        it('http://org.com/path -> http://org.com/path?&prm=tgt_v', function (){
           var uri = 'http://site.eu:80/qto/view/devops_guide_doc'
           var uriExpected = 'http://site.eu:80/qto/view/devops_guide_doc?&bid=10'
           var uriActual = uri.setUriParam("bid",10)
           assert.equal(uriActual, uriExpected);
        });

        // has the url param existing after the ? with num value
        it('http://org.com/path?prm=src_v -> http://org.com/path?&prm=tgt_v', function (){
           var uri = 'http://site.eu:80/qto/view/devops_guide_doc?bid=57'
           var uriExpected = 'http://site.eu:80/qto/view/devops_guide_doc?&bid=10'
           var uriActual = uri.setUriParam("bid",10)
           assert.equal(uriActual, uriExpected);
        });

        // has the url param existing after the ? but string value
        it('http://org.com/path?prm=src_v -> http://org.com/path?&prm=tgt_v', function (){
           var uri = 'http://site.eu:80/qto/view/devops_guide_doc?bid=boo-bar'
           var uriExpected = 'http://site.eu:80/qto/view/devops_guide_doc?&bid=boo-bar-baz'
           var uriActual = uri.setUriParam("bid","boo-bar-baz")
           assert.equal(uriActual, uriExpected);
        });

        // has the url param existing after the ?& but string value
        it('http://org.com/path?&prm=src_v -> http://org.com/path?&prm=tgt_v', function (){
           var uri = 'http://site.eu:80/qto/view/devops_guide_doc?&bid=5'
           var uriExpected = 'http://site.eu:80/qto/view/devops_guide_doc?&bid=10'
           var uriActual = uri.setUriParam("bid",10)
           assert.equal(uriActual, uriExpected);
        });

        // has the url param existing after the ? with other param
        it('http://org.com/path?prm=src_v&other_p=other_v -> http://org.com/path?&prm=tgt_v&other_p=other_v', function (){
           var uri = 'http://site.eu:80/qto/view/devops_guide_doc?bid=5&other_p=other_v'
           var uriExpected = 'http://site.eu:80/qto/view/devops_guide_doc?&bid=10&other_p=other_v'
           var uriActual = uri.setUriParam("bid",10)
           assert.equal(uriActual, uriExpected);
        });

        // has the url param existing after the ?& with other param
        it('http://org.com/path?&prm=src_v&other_p=other_v -> http://org.com/path?&prm=tgt_v&other_p=other_v', function (){
           var uri = 'http://site.eu:80/qto/view/devops_guide_doc?&bid=5&other_p&other_v'
           var uriExpected = 'http://site.eu:80/qto/view/devops_guide_doc?&bid=10&other_p&other_v'
           var uriActual = uri.setUriParam("bid",10)
           assert.equal(uriActual, uriExpected);
        });

        // has the url param existing after the ? with other param with fragment
        it('http://org.com/path?prm=src_v&other_p=other_v#f -> http://org.com/path?&prm=tgt_v&other_p=other_v#f', function (){
           var uri = 'http://site.eu:80/qto/view/devops_guide_doc?bid=5&other_p=other_v#f'
           var uriExpected = 'http://site.eu:80/qto/view/devops_guide_doc?&bid=10&other_p=other_v#f'
           var uriActual = uri.setUriParam("bid",10)
           assert.equal(uriActual, uriExpected);
        });

        // has the url param existing after the ?& with other param with fragment
        it('http://org.com/path?&prm=src_v&other_p=other_v#f -> http://org.com/path?&prm=tgt_v&other_p=other_v#f', function (){
           var uri = 'http://site.eu:80/qto/view/devops_guide_doc?&bid=5&other_p&other_v#f'
           var uriExpected = 'http://site.eu:80/qto/view/devops_guide_doc?&bid=10&other_p&other_v#f'
           var uriActual = uri.setUriParam("bid",10)
           assert.equal(uriActual, uriExpected);
        });

        // remove the param-name , param-value pair
        it('http://org.com/path?prm=src_v&other_p=other_v#f -> http://org.com/path?&prm=tgt_v&other_p=other_v#f', function (){
           var uri = 'http://site.eu:80/qto/view/devops_guide_doc?bid=5&other_p=other_v#f'
           var uriExpected = 'http://site.eu:80/qto/view/devops_guide_doc?&other_p=other_v#f'
           var uriActual = uri.setUriParam("bid",null)
           assert.equal(uriActual, uriExpected);
        });

        // remove the param-name , param-value pair
        it('http://org.com/path?&prm=src_v&other_p=other_v#f -> http://org.com/path?&prm=tgt_v&other_p=other_v#f', function (){
           var uri = 'http://site.eu:80/qto/view/devops_guide_doc?&bid=5&other_p=other_v#f'
           var uriExpected = 'http://site.eu:80/qto/view/devops_guide_doc?&other_p=other_v#f'
           var uriActual = uri.setUriParam("bid",null)
           assert.equal(uriActual, uriExpected);
        });

        // add a new param name , param value pair
        it('http://org.com/path?prm=src_v&other_p=other_v#f -> http://org.com/path?&prm=tgt_v&other_p=other_v#f', function (){
           var uri = 'http://site.eu:80/qto/view/devops_guide_doc?&other_p=other_v#f'
           var uriExpected = 'http://site.eu:80/qto/view/devops_guide_doc?&other_p=other_v&bid=foo-bar#f'
           var uriActual = uri.setUriParam("bid","foo-bar")
           assert.equal(uriActual, uriExpected);
        });

     });
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.