Додавання параметра до URL за допомогою JavaScript


276

У веб-програмі, яка використовує дзвінки AJAX, мені потрібно подати запит, але додати параметр до кінця URL-адреси, наприклад:

Оригінальна URL-адреса:

http: //server/myapp.php? id = 10

Отримана URL-адреса:

http: //server/myapp.php? id = 10 та увімкнено = вірно

Шукаючи функцію JavaScript, яка аналізує URL-адресу, переглядаючи кожен параметр, а потім додає новий параметр або оновлює значення, якщо таке вже існує.


Ви шукали аналізатори URL-адрес JavaScript ? Ви можете зробити свій власний, розділяючи на кожен & -характер, але, мабуть, простіше просто використовувати існуючий код.
csl

1
У мене був подібний сценарій колись, і ця стаття Пітера Бромберга виявилася дуже корисною:
Церебр,

2
window.history.pushState ('page2', 'Title', document.location + '/ page2.php'); зробить вашу роботу без завантаження сторінки
Рутунь Шеладія

1
Це питання має кращі відповіді тут stackoverflow.com/questions/6953944 / ...
РКБ

Неймовірно, це не рідна мова в цій бідній мові, якою є JS ....
bohr

Відповіді:


191

Основна реалізація, яку вам потрібно буде адаптувати, виглядає приблизно так:

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

    // kvp looks like ['key1=value1', 'key2=value2', ...]
    var kvp = document.location.search.substr(1).split('&');
    let i=0;

    for(; i<kvp.length; i++){
        if (kvp[i].startsWith(key + '=')) {
            let pair = kvp[i].split('=');
            pair[1] = value;
            kvp[i] = pair.join('=');
            break;
        }
    }

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

    // can return this or...
    let params = kvp.join('&');

    // reload page with new params
    document.location.search = params;
}

Це приблизно вдвічі швидше, ніж рішення на основі регулярних виразів або пошуку, але це повністю залежить від тривалості рядка запитів та індексу будь-якої відповідності


метод повільного зворотного виразів, на який я орієнтувався на виконання (приблизно + 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;
}

2
знову дякую. дивіться меншеanvaezi.com/wp-content/uploads/2009/01/test.html для основного порівняння методів
Lessan Vaezi

16
Використання escape () для виходу з параметрів URL-адреси є неправильним. Він розбивається на значення з "+" в них. Ви повинні замість цього використовувати encodeURIComponent. Повна дискусія: xkr.us/articles/javascript/encode-compare
Антонін Хільдебранд

4
Я викликаю цю функцію, і сторінка перезавантажується в нескінченному циклі. Будь ласка, допоможіть!
заявка

6
коли в URL-адресі вже немає параметрів, ви отримуєте значення? & param = значення
Roy Toledo

9
Ви не повинні використовувати, encodeURIComponentа не encodeURI? В іншому випадку будь-які символи , такі як =, &ваше ім'я або значення буде пошкоджений URI.
Адріан Пронк

271

Ви можете скористатися одним із таких:

Приклад:

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

2
Я хотів би додати параметр запиту без значення, наприклад , додавання 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. developer.mozilla.org/en-US/docs/Web/API/URLSearchParams
kanji

27
Шкода, що IE не підтримує це.
спеді

3
Тепер iOS підтримує URLSearchParams (починаючи з 9 днів після коментаря @ kanji)
MJeffryes

8
Гарні новини @MJeffryes! Досі не підтримуються IE та Netscape.
Vianney Bajart

64

Дякую всім за ваш внесок. Я використовував код 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('&');
        }
    }

3
Було б краще , щоб зміни від escape(key)і escape(value)до encodeURIComponentфункції.
колобок

5
чи слід це насправді перевірити if (kvp.length==1 && kvp[0]="")?
Чарльз Л.

@CharlesL. кращеif (document.location.search)
Любімов Роман

58

Це дуже просте рішення. Він не контролює існування параметрів і не змінює існуюче значення. Це додає ваш параметр до кінця, тож ви можете отримати останнє значення у своєму бек-коді.

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

6
Ви також маєте обліковий запис "#" у URL- url = (url.indexOf("?") != -1 ? url.split("?")[0]+"?"+part+"&"+url.split("?")[1] : (url.indexOf("#") != -1 ? url.split("#")[0]+"?"+part+"#"+ url.split("#")[1] : url+'?'+part));
адресі

2
@kanzure ця штука виглядає злом як пекло, але це саме те, що я хотів. Дякую.
Чад фон Нау

навіщо розділяти URL, щоб перевірити наявність єдиного символу? також не забудьте кодувати ... щось більше на кшталтfunction appendQs(url, key, value) { return url + (url.indexOf('?') >= 0 ? "&" : '?') + encodeURIComponent(key) + "=" + encodeURIComponent(value); };
drzaus

1
Полагодьте це. Ця функція не перевіряє, чи параметр вже наданий. Я перевірив це і отримав https://localhost/preview/inventory.html?sortci=priceASC&sortci=priceASC&sortci=stitle.
Джей

@Jay, для чого потрібна фіксація? Перевірте свої припущення. Повторювані параметри рядка запиту є законними, такими ж, як і дублікати полів форми. Ось як реалізуються списки прапорців у HTML, і вони будуть передані через рядок запиту, якщо метод форми = отримати.
Стефан

34

Ось надзвичайно спрощена версія, яка робить компроміси для розбірливості та меншої кількості рядків коду замість мікрооптимізованої продуктивності (а ми говоримо про різницю в кілька мілісекунд, реально ... завдяки природі цього (працює на місці поточного документа) ), швидше за все, це буде розміщено один раз на сторінці).

/**
* 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;
};

Потім ви використовуєте це так:

document.location.pathname + addUrlParam(document.location.search, 'foo', 'bar');

1
+1 Мені подобається, як ви можете вказати щось, крім document.location.search
Muhd

1
+1 Приємно, я погоджуюся, що розбірливість у цьому випадку важливіша, ніж мікрооптимізація, і я радий, що хтось застосував такий підхід. @Muhd Можливо, це була помилка в двигуні JS, коли ви писали цей коментар, але я просто перевірив "$ 1" у цьому контексті, і він працює чудово.
JMTyler

Дякую за рішення, хоча я також застряг, якщо хочу замінити значення, і там вже є параметр. Натомість a & it пише $ 1
Codebryo

2
Гаррет: Чи можете ви виправити свою відповідь, щоб вона замінила існуючі параметри правильно? Це просто питання заміни [\?&]з ([\?&])в RegExp (я б просто змінити його сам , але я не впевнений , що якщо політики співтовариства дозволяє виправляти помилки у відповідях).
опій

Це не працює з URL-адресою на зразок " domain.tld ", його додайте "та" замість "?"
user706420

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

І врахуйте, що параметри повинні бути закодовані перед додаванням у рядок запиту.

http://jsfiddle.net/48z7z4kx/


Невелика витік пам’яті - ви захочете видалити елемент прив’язки, який було додано до документа перед поверненням.
конопля

@freedev, Nope, я не впевнений. ;) Мені важко знайти авторитетне джерело, але дані свідчать про те, що ти прав. Оскільки створений елемент ніколи не приєднується до DOM, його слід очистити, як тільки змінна вийде із сфери застосування. API DOM не особливо добре розроблений, коли мова йде про побічні ефекти, тому я надто обережний.
конопля

Це рішення додає кінцеву косу рису до URL-адрес, які не мають параметрів шляху та переупорядкування, що є непотрібними та, можливо, небажаними змінами. Він також додає замість заміни існуючих параметрів, які не мають значення (наприклад http://abc.def/?a&b&b).
Адам Леггетт

@AdamLeggett Дякую за вказівку на помилку, яка трапляється, коли параметр запиту не має значення, я щойно виправив свою відповідь. Решта дивної поведінки, про яку ви говорите, якщо ви маєте рацію, породжуються об'єктом HTML якоря, який зазвичай є стандартним компонентом браузера. Я пропоную перевірити ще раз, тому що дуже малоймовірно, що браузер додає непотрібну чи небажану поведінку.
freedev

1
Мета функції addParam - це дійсно додавати параметр кілька разів, і, можливо, ви повинні знати, що ви можете передавати один і той же параметр навіть з тим самим значенням кілька разів. stackoverflow.com/questions/24059773 / ...
freedev

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

Я перекрив метод toString, тому немає необхідності викликати QS :: getQueryString, ви можете використовувати QS :: toString або, як я це робив у прикладах, просто покладатися на об'єкт, примушений до рядка.


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

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

window.location.search = urlParams;

.set перший agrument - ключ, другий - значення.


1
Любіть простоту цього і в тому, що він використовує методи рідного браузера
Хуан Солано

2
Це правильна відповідь, і її слід голосувати. Цей новий API є остаточним для обробки URL
Ентоні,

8

Якщо у вас є рядок з URL, який ви хочете прикрасити парам, ви можете спробувати це:

urlstring += ( urlstring.match( /[\?]/g ) ? '&' : '?' ) + 'param=value';

Це означає, що ? буде префіксом параметра, але якщо у вас вже є ? в urlstring, ніж & буде префіксом.

Я також рекомендую зробити, encodeURI( paramvariable )якщо ви не твердо кодували параметр, але він знаходиться в межахparamvariable ; або якщо у вас є смішні персонажі.

Див. Кодування URL-адреси javascript для використання encodeURIфункції.


7

Це простий спосіб додати параметр запиту:

const query = new URLSearchParams(window.location.search);
query.append("enabled", "true");

І це тут більше .

Зверніть увагу на технічні характеристики .


4
Схоже, це не підтримується в жодній версії Internet Explorer
MAXE

Ідеально підходить для мобільних пристроїв. Коли на моєму мобільному пристрої з’явиться Internet Explorer, я його викину. :-)
stillatmylinux

@MAXE ви праві IE / EDGE не дуже підтримують. Підтримується
T04435,

6

Перевірте https://github.com/derek-watson/jsUri

Маніпуляція з Uri та рядком в JavaScript.

Цей проект включає чудову бібліотеку регулярних виразів parseUri Стівена Левітана. Ви можете сміливо розбирати URL-адреси будь-яких форм і розмірів, однак недійсні або огидні.


404 - Запрошена URL-адреса / p / jsuri / на цьому сервері не знайдена. Це все, що ми знаємо.
Алігма

1
Схоже, його перемістили. Я оновив URL-адресу. Удачі!
Чарлі Лян Юань

Будь ласка, включіть у відповідь відповідні деталі, а не лише посилання.
jhpratt GOFUNDME RELICENSING

6

Колись ми бачимо ?в кінцевій URL-адресі, я знайшов деякі рішення, які генерують результати як file.php?&foo=bar. я придумав свою роботу з рішенням ідеально, як мені хочеться!

location.origin + location.pathname + location.search + (location.search=='' ? '?' : '&') + 'lang=ar'

Примітка: location.origin не працює в IE, ось його виправлення .


6

Наступна функція допоможе вам додати, оновити та видалити параметри до або з 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

// приклад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

// приклад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

// приклад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

// приклад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

Ось функція.

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

5

Це була моя власна спроба, але я використаю відповідь від 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;
}

Крім того, я знайшов цей плагін jQuery з іншої публікації в stackoverflow, і якщо вам потрібна більша гнучкість, ви можете використовувати це: http://plugins.jquery.com/project/query-object

Я думаю, що код буде (не перевірений):

return $.query.parse(sourceUrl).set(parameterName, parameterValue).toString();

Дякуємо, що поділилися кодом, Лессан. Я використовую це, і це спрацювало чудово! Я завантажив суть моєї власної версії, відредаговану трохи легше та пройшов перевірку JSHint. gist.github.com/jonathanconway/02a183920506acd9890a
Джонатан

3

Додавання до відповіді @ Vianney https://stackoverflow.com/a/44160941/6609678

Ми можемо імпортувати вбудований URL-модуль у вузол наступним чином

const { URL } = require('url');

Приклад:

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'

Корисні посилання:

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


3

Спробуйте це.

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

url.searchParamsє попередньо ініціалізованим списком параметрів для цього URLоб’єкта.
амфетамахін

2

Мені подобається відповідь Мехмета Фатіха Йылдыза, навіть він не відповів на все запитання.

У тому ж рядку, що і у його відповіді, я використовую цей код:

"Він не контролює існування параметрів і не змінює існуюче значення. Він додає ваш параметр до кінця"

  /** add a parameter at the end of the URL. Manage '?'/'&', but not the existing parameters.
   *  does escape the value (but not the key)
   */
  function addParameterToURL(_url,_key,_value){
      var param = _key+'='+escape(_value);

      var sep = '&';
      if (_url.indexOf('?') < 0) {
        sep = '?';
      } else {
        var lastChar=_url.slice(-1);
        if (lastChar == '&') sep='';
        if (lastChar == '?') sep='';
      }
      _url += sep + param;

      return _url;
  }

і тестер:

  /*
  function addParameterToURL_TESTER_sub(_url,key,value){
    //log(_url);
    log(addParameterToURL(_url,key,value));
  }

  function addParameterToURL_TESTER(){
    log('-------------------');
    var _url ='www.google.com';
    addParameterToURL_TESTER_sub(_url,'key','value');
    addParameterToURL_TESTER_sub(_url,'key','Text Value');
    _url ='www.google.com?';
    addParameterToURL_TESTER_sub(_url,'key','value');
    _url ='www.google.com?A=B';
    addParameterToURL_TESTER_sub(_url,'key','value');
    _url ='www.google.com?A=B&';
    addParameterToURL_TESTER_sub(_url,'key','value');
    _url ='www.google.com?A=1&B=2';
    addParameterToURL_TESTER_sub(_url,'key','value');

  }//*/


2

Це те, що я використовую, коли мова йде про деякі основні доповнення URL-адрес або оновлення на стороні сервера, як-от Node.js.

CoffeScript:

###
    @method addUrlParam Adds parameter to a given url. If the parameter already exists in the url is being replaced.
    @param {string} url
    @param {string} key Parameter's key
    @param {string} value Parameter's value
    @returns {string} new url containing the parameter
###
addUrlParam = (url, key, value) ->
    newParam = key+"="+value
    result = url.replace(new RegExp('(&|\\?)' + key + '=[^\&|#]*'), '$1' + newParam)
    if result is url
        result = if url.indexOf('?') != -1 then url.split('?')[0] + '?' + newParam + '&' + url.split('?')[1]
    else if url.indexOf('#') != -1 then url.split('#')[0] + '?' + newParam + '#' + url.split('#')[1]
    else url + '?' + newParam
    return result

JavaScript:

function addUrlParam(url, key, value) {
    var newParam = key+"="+value;
    var result = url.replace(new RegExp("(&|\\?)"+key+"=[^\&|#]*"), '$1' + newParam);
    if (result === url) { 
        result = (url.indexOf("?") != -1 ? url.split("?")[0]+"?"+newParam+"&"+url.split("?")[1] 
           : (url.indexOf("#") != -1 ? url.split("#")[0]+"?"+newParam+"#"+ url.split("#")[1] 
              : url+'?'+newParam));
    }
    return result;
}

var url = "http://www.example.com?foo=bar&ciao=3&doom=5#hashme";
result1.innerHTML = addUrlParam(url, "ciao", "1");
<p id="result1"></p>


2

Найпростіше рішення, працює, якщо ви вже маєте тег чи ні, і видаляє його автоматично, щоб він не мав права додавати рівні теги, отримуйте задоволення

function changeURL(tag)
{
if(window.location.href.indexOf("?") > -1) {
    if(window.location.href.indexOf("&"+tag) > -1){

        var url = window.location.href.replace("&"+tag,"")+"&"+tag;
    }
    else
    {
        var url = window.location.href+"&"+tag;
    }
}else{
    if(window.location.href.indexOf("?"+tag) > -1){

        var url = window.location.href.replace("?"+tag,"")+"?"+tag;
    }
    else
    {
        var url = window.location.href+"?"+tag;
    }
}
  window.location = url;
}

ТОДІ

changeURL("i=updated");

2

Відповідь Віяні Баджарт правильна; проте URL-адреса працюватиме лише у тому випадку, якщо у вас є повна URL-адреса з портом, хостом, шляхом та запитом:

new URL('http://server/myapp.php?id=10&enabled=true')

І URLSearchParams буде працювати, лише якщо ви передасте лише рядок запиту:

new URLSearchParams('?id=10&enabled=true')

Якщо у вас неповна або відносна URL-адреса і вам не важлива основна URL-адреса, ви можете просто розділити їх, ?щоб отримати рядок запиту та приєднатися пізніше, як це:

function setUrlParams(url, key, value) {
  url = url.split('?');
  usp = new URLSearchParams(url[1]);
  usp.set(key, value);
  url[1] = usp.toString();
  return url.join('?');
}

let url = 'myapp.php?id=10';
url = setUrlParams(url, 'enabled', true);  // url = 'myapp.php?id=10&enabled=true'
url = setUrlParams(url, 'id', 11);         // url = 'myapp.php?id=11&enabled=true'

Не сумісний з Internet Explorer.


Якщо ви використовуєте, var u = new URL(window.location), usp = u.searchParams;вам не потрібно використовувати будь-які фантазійні розбиття рядків.
амфетамахін

Хоча ваше рішення працюватиме в більшості речей, воно буде маніпулювати URL-адресою, якщо він має знак питання у значенні параметра:setUrlParams('https://example.com?foo=thing???&bar=baz', 'baz', 'qux') => "https://example.com?foo=thing&baz=qux???&bar=baz"
amphetamachine

1

Якщо ви заплутуєтесь із URL-адресами у посиланнях чи десь ще, можливо, вам доведеться також врахувати хеш. Ось досить просте для розуміння рішення. Напевно, це НЕ НАЙЧАСНО, оскільки він використовує регулярний вираз ... але в 99,999% випадків різниця насправді не має значення!

function addQueryParam( url, key, val ){
    var parts = url.match(/([^?#]+)(\?[^#]*)?(\#.*)?/);
    var url = parts[1];
    var qs = parts[2] || '';
    var hash = parts[3] || '';

    if ( !qs ) {
        return url + '?' + key + '=' + encodeURIComponent( val ) + hash;
    } else {
        var qs_parts = qs.substr(1).split("&");
        var i;
        for (i=0;i<qs_parts.length;i++) {
            var qs_pair = qs_parts[i].split("=");
            if ( qs_pair[0] == key ){
                qs_parts[ i ] = key + '=' + encodeURIComponent( val );
                break;
            }
        }
        if ( i == qs_parts.length ){
            qs_parts.push( key + '=' + encodeURIComponent( val ) );
        }
        return url + '?' + qs_parts.join('&') + hash;
    }
}

Не впевнений, чому хтось прихильнив тебе. Це одне з найнадійніших рішень, хоча це набагато більше коду, ніж потрібно.
Адам Леггетт

1

Найпростішим рішенням, про який я можу придумати, є цей метод, який поверне модифікований URI. Я відчуваю, що більшість із вас працює надто важко.

function setParam(uri, key, val) {
    return uri
        .replace(new RegExp("([?&]"+key+"(?=[=&#]|$)[^#&]*|(?=#|$))"), "&"+key+"="+encodeURIComponent(val))
        .replace(/^([^?&]+)&/, "$1?");
}

0

Ок, я порівнюю дві функції, одну зробив власноруч (regExp), а іншу зробив (annakata).

Розділити масив:

function insertParam(key, value)
{
    key = escape(key); value = escape(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
    return "&"+kvp.join('&'); 
}

Метод Regexp:

function addParameter(param, value)
{
    var regexp = new RegExp("(\\?|\\&)" + param + "\\=([^\\&]*)(\\&|$)");
    if (regexp.test(document.location.search)) 
        return (document.location.search.toString().replace(regexp, function(a, b, c, d)
        {
                return (b + param + "=" + value + d);
        }));
    else 
        return document.location.search+ param + "=" + value;
}

Тестовий випадок:

time1=(new Date).getTime();
for (var i=0;i<10000;i++)
{
addParameter("test","test");
}
time2=(new Date).getTime();
for (var i=0;i<10000;i++)
{
insertParam("test","test");
}

time3=(new Date).getTime();

console.log((time2-time1)+" "+(time3-time2));

Здається, що навіть при найпростішому рішенні (коли regexp використовує лише тест і не вводить функцію .замінити), воно все-таки повільніше, ніж розщеплення ... Ну. Regexp начебто повільний, але ... е-е ...


як я вже згадував, це насправді порівняно повільно - і незрозуміло, document.location.search зрозуміліше
annakata

0

Ось що я роблю. Використовуючи мою функцію editParams (), ви можете додавати, видаляти або змінювати будь-який параметр, а потім використовувати вбудовану функцію substituState () для оновлення URL-адреси:

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


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

0

Як найкраще я можу сказати, що жоден з наведених вище відповідей не стосується випадку, коли рядок запиту містить параметри, які самі є масивом і, отже, з'являться не один раз, наприклад:

http://example.com?sizes[]=a&sizes[]=b

Наступна функція - це те, що я написав для оновлення document.location.search. Він бере аргумент масивів пар ключ / значення як аргумент, і він поверне переглянутий варіант останнього, який ви можете робити все, що завгодно. Я використовую це так:

var newParams = [
    ['test','123'],
    ['best','456'],
    ['sizes[]','XXL']
];
var newUrl = document.location.pathname + insertParams(newParams);
history.replaceState('', '', newUrl);

Якщо поточна URL-адреса була:

http://example.com/index.php?test=replaceme&sizes[]=XL

Це отримає вас

http://example.com/index.php?test=123&sizes[]=XL&sizes[]=XXL&best=456

Функція

function insertParams(params) {
    var result;
    var ii = params.length;
    var queryString = document.location.search.substr(1);
    var kvps = queryString ? queryString.split('&') : [];
    var kvp;
    var skipParams = [];
    var i = kvps.length;
    while (i--) {
        kvp = kvps[i].split('=');
        if (kvp[0].slice(-2) != '[]') {
            var ii = params.length;
            while (ii--) {
                if (params[ii][0] == kvp[0]) {
                    kvp[1] = params[ii][1];
                    kvps[i] = kvp.join('=');
                    skipParams.push(ii);
                }
            }
        }
    }
    var ii = params.length;
    while (ii--) {
        if (skipParams.indexOf(ii) === -1) {
            kvps.push(params[ii].join('='));
        }
    }
    result = kvps.length ? '?' + kvps.join('&') : '';
    return result;
}

0

Спробуйте
регулярні вирази, так повільно, таким чином:

var SetParamUrl = function(_k, _v) {// replace and add new parameters

    let arrParams = window.location.search !== '' ? decodeURIComponent(window.location.search.substr(1)).split('&').map(_v => _v.split('=')) : Array();
    let index = arrParams.findIndex((_v) => _v[0] === _k); 
    index = index !== -1 ? index : arrParams.length;
    _v === null ? arrParams = arrParams.filter((_v, _i) => _i != index) : arrParams[index] = [_k, _v];
    let _search = encodeURIComponent(arrParams.map(_v => _v.join('=')).join('&'));

    let newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + (arrParams.length > 0 ? '?' +  _search : ''); 

    // window.location = newurl; //reload 

    if (history.pushState) { // without reload  
        window.history.pushState({path:newurl}, null, newurl);
    }

};

var GetParamUrl = function(_k) {// get parameter by key

    let sPageURL = decodeURIComponent(window.location.search.substr(1)),
        sURLVariables = sPageURL.split('&').map(_v => _v.split('='));
    let _result = sURLVariables.find(_v => _v[0] === _k);
    return _result[1];

};

Приклад:

        // https://some.com/some_path
        GetParamUrl('cat');//undefined
        SetParamUrl('cat', "strData");// https://some.com/some_path?cat=strData
        GetParamUrl('cat');//strData
        SetParamUrl('sotr', "strDataSort");// https://some.com/some_path?cat=strData&sotr=strDataSort
        GetParamUrl('sotr');//strDataSort
        SetParamUrl('cat', "strDataTwo");// https://some.com/some_path?cat=strDataTwo&sotr=strDataSort
        GetParamUrl('cat');//strDataTwo
        //remove param
        SetParamUrl('cat', null);// https://some.com/some_path?sotr=strDataSort

0

З новими досягненнями в JS ось як можна додати параметр запиту до URL:

var protocol = window.location.protocol,
    host = '//' + window.location.host,
    path = window.location.pathname,
    query = window.location.search;

var newUrl = protocol + host + path + query + (query ? '&' : '?') + 'param=1';

window.history.pushState({path:newUrl}, '' , newUrl);

Також перегляньте цю можливість Moziila URLSearchParams.append ()


0

Це буде працювати у всіх сучасних браузерах.

function insertParam(key,value) {
      if (history.pushState) {
          var newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?' +key+'='+value;
          window.history.pushState({path:newurl},'',newurl);
      }
    }

0

Скидання всіх рядків запиту

var params = { params1:"val1", params2:"val2" };
let str = jQuery.param(params);

let uri = window.location.href.toString();
if (uri.indexOf("?") > 0)
   uri = uri.substring(0, uri.indexOf("?"));

console.log(uri+"?"+str);
//window.location.href = uri+"?"+str;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.