Aggiunta di un parametro all'URL con JavaScript


276

In un'applicazione Web che utilizza le chiamate AJAX, devo inviare una richiesta ma aggiungere un parametro alla fine dell'URL, ad esempio:

URL originale:

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

URL risultante:

http: //server/myapp.php? id = 10 & enabled = true

Alla ricerca di una funzione JavaScript che analizza l'URL osservando ciascun parametro, quindi aggiunge il nuovo parametro o aggiorna il valore se ne esiste già uno.


Hai cercato i parser di URL javascript ? Puoi crearne uno tuo, suddividendolo su ogni & -character, ma è probabilmente più semplice usare solo il codice esistente.
CSL

1
Ho avuto uno scenario simile una volta e ho trovato questo articolo di Peter Bromberg molto utile:
Cerebrus,

2
window.history.pushState ('page2', 'Title', document.location + '/ page2.php'); farà il tuo lavoro senza caricare la pagina
Rutunj sheladiya

1
Questa domanda ha risposte migliori qui stackoverflow.com/questions/6953944/...
RKB

incredibile che questo non sia nativo in questa povera lingua che JS è ....
bohr

Risposte:


192

Un'implementazione di base che dovrai adattare sarebbe simile a questa:

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

Questo è circa due volte più veloce di una regex o di una soluzione basata sulla ricerca, ma dipende completamente dalla lunghezza della stringa di query e dall'indice di qualsiasi corrispondenza


il metodo regex lento che ho confrontato per amor di completamenti (circa + 150% più lento)

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
grazie ancora. vedi lessanvaezi.com/wp-content/uploads/2009/01/test.html per un confronto di base dei metodi
Lessan Vaezi,

16
L'uso di escape () per sfuggire ai parametri URL è errato. Si rompe per i valori con "+" in essi. Dovresti invece usare encodeURIComponent. Discussione completa: xkr.us/articles/javascript/encode-compare
Antonin Hildebrand

4
Sto chiamando questa funzione e la pagina si sta ricaricando in un ciclo infinito. Per favore aiuto!
invia il

6
quando nessun parametro è già presente nell'URL si ottiene un valore? & param = value
Roy Toledo,

9
Non dovresti usare encodeURIComponentpiuttosto che encodeURI? Altrimenti qualsiasi carattere come =, &nel tuo nome o valore, corromperà l'URI.
Adrian Pronk,

271

Puoi usare uno di questi:

Esempio:

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
Vorrei aggiungere un parametro di query senza un valore, ad esempio aggiungendolo XMLin http://foo.bar/?x=1&y=2modo che il risultato finale sia http://foo.bar/?x=1&y=2&XML. È possibile? Ho provato url.searchParams.set('XML');, url.searchParams.set('XML', null);e url.searchParams.set('XML', undefined);- ma nessuno ha funzionato in Chrome 63 .
Abdull

2
Grazie! Peccato che non sia ancora supportato da iOS. developer.mozilla.org/en-US/docs/Web/API/URLSearchParams
kanji

27
Peccato che IE non lo supporti.
spedito il

3
iOS ora supporta URLSearchParams (da 9 giorni dopo il commento di @ kanji)
MJeffryes

8
Buone notizie @MJeffryes! Ancora non supportato da IE e Netscape.
Vianney Bajart,

64

Grazie a tutti per il vostro contributo. Ho usato il codice annakata e modificato per includere anche il caso in cui non vi è alcuna stringa di query nell'URL. Spero che questo possa aiutare.

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
Sarebbe meglio per passare da escape(key)e escape(value)per encodeURIComponentla funzione.
kolobok,

5
questo dovrebbe effettivamente controllare if (kvp.length==1 && kvp[0]="")?
Charles L.

@CharlesL. meglio èif (document.location.search)
Lyubimov Roman

58

Questa è una soluzione molto semplice. Non controlla l'esistenza dei parametri e non modifica il valore esistente. Aggiunge il parametro alla fine, in modo da poter ottenere l'ultimo valore nel codice di back-end.

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

6
dovresti anche tenere conto di "#" url = (url.indexOf("?") != -1 ? url.split("?")[0]+"?"+part+"&"+url.split("?")[1] : (url.indexOf("#") != -1 ? url.split("#")[0]+"?"+part+"#"+ url.split("#")[1] : url+'?'+part));
nell'URL

2
@kanzure questa cosa sembra diabolica da morire, ma è esattamente quello che volevo. Grazie.
Chad von Nau,

perché dividere l'URL per verificare l'esistenza di un singolo personaggio? inoltre, non dimenticare di codificare ... qualcosa di più similefunction appendQs(url, key, value) { return url + (url.indexOf('?') >= 0 ? "&" : '?') + encodeURIComponent(key) + "=" + encodeURIComponent(value); };
drzaus,

1
Aggiustalo. Questa funzione non controlla se il parametro è già fornito. Ho provato questo e ottenuto https://localhost/preview/inventory.html?sortci=priceASC&sortci=priceASC&sortci=stitle.
Jay,

@Jay, perché ha bisogno di essere riparato? Controlla i tuoi presupposti. I parametri della stringa di query duplicata sono legali, lo stesso dei campi modulo duplicati. Ecco come vengono implementati gli elenchi delle caselle di controllo in HTML e questi verranno passati tramite una stringa di query se il metodo form = get.
stephen

34

Ecco una versione notevolmente semplificata, che fa compromessi per leggibilità e meno righe di codice invece di prestazioni micro-ottimizzate (e stiamo parlando di una differenza di pochi millisecondi, realisticamente ... a causa della natura di questo (operando sulla posizione del documento corrente ), molto probabilmente verrà eseguito una volta su una pagina).

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

Lo useresti quindi in questo modo:

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

1
+1 Mi piace come specificare qualcosa di diverso da document.location.search
Muhd

1
+1 Fantastico, sono d'accordo sul fatto che la leggibilità è più importante della micro-ottimizzazione in questo caso e sono felice di vedere che qualcuno ha adottato questo approccio. @Muhd Forse è stato un errore nel motore JS quando hai scritto quel commento, ma ho appena testato "$ 1" in questo contesto e funziona benissimo.
JMTyler,

Grazie mille per la soluzione, anche se rimango bloccato se voglio sostituire un valore e c'è già un parametro lì. Invece un & scrive $ 1
Codebryo

2
Garrett: Potresti risolvere la tua risposta in modo che sostituisca correttamente i parametri esistenti? Si tratta solo di sostituirlo [\?&]con ([\?&])RegExp (lo modificherei da solo ma non sono sicuro che la politica della comunità consenta di correggere i bug nelle risposte).
Opyh,

Questo non funziona con url come " domain.tld ", aggiunge "&" invece di "?"
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);

E si noti che i parametri devono essere codificati prima di essere aggiunti nella stringa di query.

http://jsfiddle.net/48z7z4kx/


Piccola perdita di memoria: ti consigliamo di rimuovere l'elemento di ancoraggio che è stato aggiunto al documento prima di tornare.
canapa,

@freedev, No, non ne sono sicuro. ;) Sto facendo fatica a trovare una fonte autorevole ma l'evidenza suggerisce che tu abbia ragione. Poiché l'elemento creato non è mai collegato al DOM, è necessario pulirlo una volta che la variabile non rientra nell'ambito. L'API DOM non è particolarmente ben progettata quando si tratta di effetti collaterali, quindi sono eccessivamente cauto.
canapa,

Questa soluzione aggiunge una barra finale agli URL che non hanno percorso e riordina i parametri, che sono modifiche non necessarie e forse indesiderabili. Aggiunge inoltre anziché sostituire i parametri esistenti che non hanno alcun valore (ad es http://abc.def/?a&b&b.).
Adam Leggett,

@AdamLeggett Grazie per aver segnalato il bug che si verifica quando un parametro di richiesta non ha valore, ho appena corretto la mia risposta. I restanti comportamenti strani di cui stai parlando, se hai ragione, sono generati dall'oggetto anchor HTML che di solito è un componente standard del browser. Suggerisco di ricontrollare perché è molto improbabile che un browser aggiunga comportamenti non necessari o indesiderati.
Freedev,

1
Lo scopo della funzione addParam è infatti aggiungere più volte un parametro e forse dovresti sapere che puoi passare lo stesso parametro anche con lo stesso valore più volte. stackoverflow.com/questions/24059773/...
freedev

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

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

window.location.search = urlParams;

.set primo agrument è la chiave, il secondo è il valore.


1
Adoro la semplicità di questo e che utilizza metodi browser nativi
Juan Solano,

2
Questa è la risposta corretta e dovrebbe essere votata per primo. Questa nuova API è il definitivo per l'elaborazione degli URL
Anthony,

19

Ho una 'classe' che fa questo ed eccolo qui:

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

Ho ignorato il metodo toString, quindi non è necessario chiamare QS :: getQueryString, è possibile utilizzare QS :: toString o, come ho fatto negli esempi, basarsi sull'oggetto forzato in una stringa.


8

Se hai una stringa con url che vuoi decorare con un parametro, puoi provare questo:

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

Questo significa che ? sarà il prefisso del parametro, ma se hai già ? in urlstring, che e sarà il prefisso.

Vorrei anche raccomandare di fare encodeURI( paramvariable )se non hai codificato il parametro, ma è all'interno di un paramvariable; o se ci sono personaggi divertenti.

Vedi la codifica URL javascript per l'utilizzo della encodeURIfunzione.


7

Questo è un modo semplice per aggiungere un parametro di query:

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

E questo è più qui .

Si prega di notare le specifiche di supporto .


4
Sembra che questo non sia supportato in nessuna versione di Internet Explorer
MAXE

Ideale per dispositivi mobili. Quando Internet Explorer si presenta sul mio dispositivo mobile, lo butto via. :-)
stillatmylinux,

@MAXE hai ragione IE / EDGE non supportano molto. Supportato in
T04435 il

6

Dai un'occhiata a https://github.com/derek-watson/jsUri

Manipolazione di stringhe Uri e query in javascript.

Questo progetto incorpora l'eccellente libreria di espressioni regolari parseUri di Steven Levithan. Puoi analizzare in modo sicuro URL di tutte le forme e dimensioni, comunque non validi o orribili.


404 - L'URL richiesto / p / jsuri / non è stato trovato su questo server. È tutto quello che sappiamo.
Aligma,

1
Sembra che sia stato spostato. Ho aggiornato l'URL. Buona fortuna!
Charlie Liang Yuan,

Includi i dettagli rilevanti nella tua risposta, non solo un link.
jhpratt GOFUNDME RELICENSING,

6

Qualche volta vediamo ?nell'URL finale, ho trovato alcune soluzioni che generano risultati come file.php?&foo=bar. mi è venuta in mente che la mia soluzione funziona perfettamente come voglio!

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

Nota: location.origin non funziona in IE, ecco la sua soluzione .


6

La seguente funzione ti aiuterà ad aggiungere, aggiornare ed eliminare i parametri da o verso l'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

// example2

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

// Example3

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

// Esempio4

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

// Esempio5

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

Ecco la funzione.

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

Questo è stato il mio tentativo, ma userò la risposta di annakata in quanto sembra molto più pulita:

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

Inoltre, ho trovato questo plugin jQuery da un altro post su StackOverflow e se hai bisogno di maggiore flessibilità puoi usarlo: http://plugins.jquery.com/project/query-object

Penserei che il codice sarebbe (non testato):

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

Grazie per aver condiviso il tuo codice, Lessan. Ho usato questo ed ha funzionato alla grande! Ho caricato una sintesi della mia versione, modificata per essere leggermente più concisa e superare la convalida di JSHint. gist.github.com/jonathanconway/02a183920506acd9890a
Jonathan

3

Aggiunta alla risposta di @ Vianney https://stackoverflow.com/a/44160941/6609678

Possiamo importare il modulo URL incorporato nel nodo come segue

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

Esempio:

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'

Link utili:

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


3

Prova questo.

// 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è l'elenco dei parametri preinizializzato per URLquell'oggetto.
anfetamachina il

2

Mi piace la risposta di Mehmet Fatih Yıldız anche se non ha risposto all'intera domanda.

Nella stessa riga della sua risposta, utilizzo questo codice:

"Non controlla l'esistenza dei parametri e non modifica il valore esistente. Aggiunge il parametro alla fine"

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

e il tester:

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

Questo è quello che uso quando si tratta di alcune aggiunte o aggiornamenti di base ai parametri URL sul lato server come 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

La soluzione più semplice, funziona se hai già un tag o meno e lo rimuove automaticamente in modo da non continuare ad aggiungere tag uguali, divertiti

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

POI

changeURL("i=updated");

2

La risposta di Vianney Bajart è corretta; tuttavia, l' URL funzionerà solo se si dispone dell'URL completo con porta, host, percorso e query:

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

E URLSearchParams funzionerà solo se passi solo la stringa di query:

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

Se hai un URL incompleto o relativo e non ti interessa l'URL di base, puoi semplicemente dividerlo ?per ottenere la stringa di query e unirti in seguito in questo modo:

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'

Non compatibile con Internet Explorer.


Se lo usi, var u = new URL(window.location), usp = u.searchParams;non devi usare alcuna suddivisione di stringhe di fantasia.
anfetamachina il

Mentre la tua soluzione funzionerà per la maggior parte delle cose, manterrà l'URL se ha un punto interrogativo in un valore di parametro:setUrlParams('https://example.com?foo=thing???&bar=baz', 'baz', 'qux') => "https://example.com?foo=thing&baz=qux???&bar=baz"
amphetamachine

1

Se stai scherzando con gli URL nei link o da qualche altra parte, potresti dover prendere in considerazione anche l'hash. Ecco una soluzione abbastanza semplice da capire. Probabilmente non il più veloce dal momento che usa una regex ... ma nel 99,999% dei casi, la differenza non conta davvero!

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

Non sono sicuro del motivo per cui qualcuno ti ha votato. Questa è una delle soluzioni più affidabili, sebbene sia molto più codice del necessario.
Adam Leggett,

1

La soluzione più semplice che mi viene in mente è questo metodo, che restituirà l'URI modificato. Sento che molti di voi stanno lavorando troppo duramente.

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

0

Ok qui confronto due funzioni, una creata da me (regExp) e un'altra creata da (annakata).

Matrice divisa:

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

Metodo di ricarica:

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

Caso di prova:

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

Sembra che anche con la soluzione più semplice (quando regexp usa solo test e non entra nella funzione .replace) è ancora più lento della divisione ... Bene. Regexp è un po 'lento ma ... uhh ...


come ho già detto, questo è relativamente lento - e prima, document.location.search è più chiaro
annakata,

0

Ecco cosa faccio. Utilizzando la mia funzione editParams (), è possibile aggiungere, rimuovere o modificare qualsiasi parametro, quindi utilizzare la funzione built-in replaceState () per aggiornare l'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

Come meglio posso dire, nessuna delle risposte di cui sopra risolve il caso in cui la stringa di query contiene parametri che sono essi stessi un array e quindi appariranno più di una volta, ad esempio:

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

La seguente funzione è quella che ho scritto per aggiornare document.location.search. Prende una matrice di matrici coppia chiave / valore come argomento e restituirà una versione rivista di quest'ultima con la quale puoi fare tutto ciò che desideri. Lo sto usando in questo modo:

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

Se l'URL corrente era:

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

Questo ti prenderebbe

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

Funzione

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

Prova
le espressioni regolari, così lente, quindi:

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

};

Esempio:

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

Con i nuovi risultati in JS ecco come si possono aggiungere parametri di query all'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);

Vedi anche questa possibilità Moziila URLSearchParams.append ()


0

Funzionerà con tutti i browser moderni.

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

Reimposta tutta la stringa di query

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>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.