URL'ye JavaScript ile parametre ekleme


276

AJAX çağrılarını kullanan bir web uygulamasında, bir istek göndermem, ancak URL'nin sonuna bir parametre eklemem gerekiyor, örneğin:

Orijinal URL:

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

Sonuç URL'si:

http: //server/myapp.php? id = 10 & etkin = doğru

Her parametreye bakarak URL'yi ayrıştıran, ardından yeni parametreyi ekleyen veya zaten varsa değeri güncelleyen bir JavaScript işlevi aramak.


Aradığınız javascript url ayrıştırıcıları ? Her bir & karakterine bölünerek kendi kodunuzu oluşturabilirsiniz, ancak muhtemelen mevcut kodu kullanmak daha kolaydır.
csl

1
Bir zamanlar benzer bir senaryom vardı ve Peter Bromberg'in bu makalesini çok yararlı buldum :
Cerebrus

2
window.history.pushState ('sayfa2', 'Başlık', belge.konumu + '/ sayfa2.php'); sayfa yüklemeden çalışmanızı yapacak
Rutunj sheladiya


İnanılmaz bu JS bu zayıf dilde yerli değil ....
bohr

Yanıtlar:


191

Uyarlamanız gereken temel bir uygulama şöyle görünecektir:

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

Bu, normal ifade veya arama tabanlı bir çözümün yaklaşık iki katıdır, ancak bu tamamen sorgu dizesinin uzunluğuna ve herhangi bir eşleşmenin dizinine bağlıdır


tamamlama uğruna karşılaştırdığım yavaş normal ifade yöntemi (yaklaşık +% 150 daha yavaş)

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
Tekrar teşekkürler. yöntemlerin temel bir karşılaştırması için lessanvaezi.com/wp-content/uploads/2009/01/test.html adresine bakın
Lessan Vaezi

16
URL parametrelerinden kaçmak için escape () kullanmak yanlıştır. İçinde "+" bulunan değerler için kırılır. Bunun yerine encodeURIComponent kullanmalısınız. Tam tartışma: xkr.us/articles/javascript/encode-compare
Antonin Hildebrand

4
Bu işlevi çağırıyorum ve sayfa sonsuz döngüde yeniden yükleniyor. Lütfen yardım et!
sumit

6
url'de hiçbir parametre olmadığında bir? & param = değeri elde edersiniz
Roy Toledo

9
Kullanmak encodeURIComponentyerine kullanmamalı mıydın encodeURI? Aksi takdirde herhangi bir karakter gibi =, &adınız veya değeri URI olacak bozuk içinde.
Adrian Pronk

271

Bunlardan birini kullanabilirsiniz:

Misal:

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
Ben örneğin ekleyerek, bir değeri olmayan bir sorgu parametresi eklemek istediğiniz XMLiçin http://foo.bar/?x=1&y=2o kadar sonuç olduğunu http://foo.bar/?x=1&y=2&XML. Mümkün mü? Denedim url.searchParams.set('XML');, url.searchParams.set('XML', null);ve url.searchParams.set('XML', undefined);- ancak hiçbiri Chrome 63'te çalışmadı .
Abdull

2
Teşekkürler! Çok kötü, henüz iOS tarafından desteklenmiyor. developer.mozilla.org/tr-TR/docs/Web/API/URLSearchParams
kanji

27
Çok kötü IE desteklemiyor.
18'de casusluk

3
iOS artık URLSearchParams'ı destekliyor (@ kanji'nin yorumundan 9 gün sonra)
MJeffryes

8
İyi haber @MJeffryes! IE ve Netscape tarafından hala desteklenmemektedir.
Vianney Bajart

64

Katkınız için hepinize teşekkür ederim. Annakata kodu kullandım ve ayrıca url'de hiç sorgu dizesi olmadığı durumu da içerecek şekilde değiştirildi. Umarım bu yardımcı olur.

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
Değişmek escape(key)ve işlevini yerine escape(value)getirmek daha iyi olur encodeURIComponent.
kolobok

5
bu gerçekten kontrol etmeli if (kvp.length==1 && kvp[0]="")mi?
Charles L.

@CharlesL. daha iyiif (document.location.search)
Lyubimov Roman

58

Bu çok basit bir çözüm. Parametre varlığını kontrol etmez ve mevcut değeri değiştirmez. Sonuna parametrenizi ekler, böylece arka uç kodunuzda en son değeri elde edebilirsiniz.

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

6
Ayrıca url içinde "#" için hesap gerekir .. İşte bazı kod slop:url = (url.indexOf("?") != -1 ? url.split("?")[0]+"?"+part+"&"+url.split("?")[1] : (url.indexOf("#") != -1 ? url.split("#")[0]+"?"+part+"#"+ url.split("#")[1] : url+'?'+part));
kanzure

2
@kanzure bu şey cehennem gibi kötü görünüyor, ama tam olarak istediğim buydu. Teşekkürler.
Chad von Nau

neden tek bir karakterin varlığını kontrol etmek için url'yi bölmeliyim? Ayrıca kodlamayı unutmayın ... daha çok benzerfunction appendQs(url, key, value) { return url + (url.indexOf('?') >= 0 ? "&" : '?') + encodeURIComponent(key) + "=" + encodeURIComponent(value); };
drzaus

1
Düzelt. Bu işlev, parametrenin önceden sağlanmış olup olmadığını kontrol etmez. Bunu test ettim ve aldım https://localhost/preview/inventory.html?sortci=priceASC&sortci=priceASC&sortci=stitle.
Jay

@Jay, neden düzeltilmesi gerekiyor? Varsayımlarınızı kontrol edin. Yinelenen sorgu dizesi parametreleri, yinelenen form alanlarıyla aynı olan yasaldır. HTML'de onay kutusu listeleri bu şekilde uygulanır ve form yöntemi = get ise bunlar sorgu dizesi aracılığıyla geçirilir.
stephen

34

Burada, mikro optimize edilmiş performans yerine okunabilirlik ve daha az kod satırı için büyük ölçüde basitleştirilmiş bir sürüm var (ve gerçekte ... bunun doğası gereği (mevcut belgenin konumunda çalışarak) birkaç milisaniye farkından bahsediyoruz. ), büyük olasılıkla bir sayfada bir kez çalıştırılacaktır).

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

Daha sonra bunu şöyle kullanırsınız:

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

1
+1 document.location.search dışında bir şeyi nasıl belirtebileceğinizi seviyorum.
Muhd

1
+1 Harika, bu durumda okunabilirliğin mikro optimizasyondan daha önemli olduğunu kabul ediyorum ve birinin bu yaklaşımı benimsediğini görmekten memnuniyet duyuyorum. @Muhd Belki bu yorumu yazdığınızda JS motorunda bir hataydı, ama ben sadece bu bağlamda '1 $' ı test ettim ve iyi çalışıyor.
JMTyler

Çözüm için çok teşekkürler, ben de bir değeri değiştirmek istiyorsanız ben de takılıp olsun ve zaten orada bir parametre var. Bunun yerine a & 1 $ yazar
Codebryo

2
Garrett: Cevabınızı, mevcut parametreleri doğru bir şekilde değiştirecek şekilde düzeltebilir misiniz? Bu sadece RegExp [\?&]ile değiştirme meselesidir ([\?&])(sadece kendim düzenlerdim ama topluluk politikasının cevaplardaki hataları düzeltmeye izin verip vermediğinden emin değilim).
opyh

Bu, "?" Yerine " domain.tld " eklentisi "&" gibi url ile çalışmıyor.
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);

Ayrıca, parametrelerin sorgu dizesine eklenmeden önce kodlanması gerektiğini lütfen unutmayın.

http://jsfiddle.net/48z7z4kx/


Küçük bellek sızıntısı - dönmeden önce belgeye eklenen bağlantı öğesini kaldırmak isteyeceksiniz.
kenevir

@freedev, Hayır, emin değilim. ;) Yetkili bir kaynak bulmakta zorlanıyorum ama kanıtlar doğru olduğunuzu gösteriyor. Oluşturulan eleman DOM iliştirilmiş asla olduğundan, gereken değişken kapsamı dışına gider bir kez temizlenmelidir. DOM API, yan etkiler söz konusu olduğunda özellikle iyi tasarlanmamıştır, bu yüzden aşırı ihtiyatlıyım.
kenevir

Bu çözüm, yolu olmayan URL'lerin sonuna eğik çizgi ekler ve gereksiz ve muhtemelen istenmeyen değişiklikler olan parametreleri yeniden sıralar. Ayrıca değeri olmayan mevcut parametreleri değiştirmek yerine ekler (örneğin http://abc.def/?a&b&b).
Adam Leggett

@AdamLeggett Bir istek parametresinin değeri olmadığında oluşan hatayı işaret ettiğiniz için teşekkürler, cevabımı düzelttim. Bahsettiğiniz diğer garip davranışlar, eğer haklıysanız, genellikle standart bir tarayıcı bileşeni olan HTML bağlantı nesnesi tarafından oluşturulur. Bir tarayıcının gereksiz veya istenmeyen davranışlar eklemesi pek olası olmadığından iki kez kontrol etmenizi öneririm.
freedev

1
AddParam işlevinin amacı aslında bir parametreyi birden çok kez eklemektir ve belki aynı parametreyi birden çok kez bile geçirebileceğinizi bilmelisiniz. stackoverflow.com/questions/24059773/…
freedev

19

Bunu yapan bir 'sınıf' var ve işte burada:

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

Bu yüzden QS :: getQueryString'i çağırmaya gerek yok, toString yöntemini geçersiz kıldım, QS :: toString kullanabilirsiniz veya örneklerde yaptığım gibi sadece bir dize zorlanan nesneye güveniyor.


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

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

window.location.search = urlParams;

ilk küme anahtardır, ikincisi değerdir.


1
Bunun sadeliğini seviyorum ve yerel tarayıcı yöntemlerini kullanıyor
Juan Solano

2
Bu doğru cevaptır ve en çok oy alanlar olmalıdır. Bu yeni API, URL işleme
Anthony

8

Bir parametreyle süslemek istediğiniz url'li bir dizeniz varsa, bunu deneyebilirsiniz:

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

Bunun anlamı nedir? parametrenin öneki olacaktır, ancak zaten varsa ? içinde urlstring, daha önce & olacak.

Ayrıca encodeURI( paramvariable )hardcoded parametresi yoktu, ama bir içinde olduğunu tavsiye ederim paramvariable; ya da içinde komik karakterler varsa.

İşlevin kullanımı için bkz. Javascript URL KodlamasıencodeURI .


7

Bir sorgu parametresi eklemenin basit bir yoludur:

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

Ve işte burada daha fazla .

Lütfen destek teknik özelliklerine dikkat edin .


4
Bu, Internet Explorer'ın herhangi bir sürümünde desteklenmiyor gibi görünüyor
MAXE

Mobil cihazlar için ideal. Internet Explorer mobil cihazımda göründüğünde cihazı atacağım. :-)
stillatmylinux

@MAXE haklısın IE / EDGE fazla desteklemiyor. Desteklenen
T04435

6

Check out https://github.com/derek-watson/jsUri

Javascript Uri ve sorgu dizesi manipülasyonu.

Bu proje Steven Levithan'ın mükemmel parseUri düzenli ifade kütüphanesini içermektedir. Geçersiz veya iğrenç olsa da, tüm şekil ve boyutlardaki URL'leri güvenle ayrıştırabilirsiniz.


404 - İstenen URL / p / jsuri / bu sunucuda bulunamadı. Tüm bildiğimiz bu.
Aligma

1
Taşınmış gibi görünüyor. URL'yi güncelledim. İyi şanslar!
Charlie Liang Yuan

Lütfen ilgili ayrıntıları yalnızca bir bağlantıya değil cevabınıza ekleyin.
jhpratt GOFUNDME RELICENSING

6

Bazen ?sonunda URL görüyorum , sonuç olarak bazı çözümler buldum file.php?&foo=bar. kendi çözüm çalışmalarımı mükemmel bir şekilde buldum!

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

Not: location.origin IE'de çalışmıyor, işte düzeltmesi .


6

Aşağıdaki işlev URL'ye veya URL'den parametre eklemenize, güncellemenize ve silmenize yardımcı olacaktır.

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

// example4

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

// Example5

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

İşte işlevi.

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

Bu benim kendi girişimimdi, ama cevabı annakata'nın daha temiz göründüğü gibi kullanacağım:

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

Ayrıca, stackoverflow üzerinde başka bir yazıdan bu jQuery eklentisini buldum ve daha fazla esnekliğe ihtiyacınız varsa bunu kullanabilirsiniz: http://plugins.jquery.com/project/query-object

Kod olurdu (test etmedi) düşünürdüm:

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

Kodunuzu paylaştığınız için teşekkürler Lessan. Bunu kullanıyorum ve harika çalıştı! Kendi versiyonumun bir özetini yükledim, biraz daha özlü ve JSHint doğrulamasını geçmek için düzenlendi. gist.github.com/jonathanconway/02a183920506acd9890a
Jonathan

3

@ Vianney'nin Cevabına Ekleme https://stackoverflow.com/a/44160941/6609678

Biz yapabilirsiniz yerleşik URL modülü düğümünde içe şöyle

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

Misal:

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'

Kullanışlı bağlantılar:

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


3

Bunu dene.

// 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.searchParamso URLnesne için önceden başlatılmış parametre listesidir .
amfetamin

2

Bütün soruyu cevaplamasa da Mehmet Fatih Yıldız'ın cevabını seviyorum.

Cevabıyla aynı satırda, bu kodu kullanıyorum:

"Parametre varlığını kontrol etmez ve mevcut değeri değiştirmez. Parametrenizi sonuna ekler"

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

ve test cihazı:

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

Node.js gibi sunucu tarafında bazı temel url param eklemeleri veya güncellemeleri söz konusu olduğunda kullandığım şey budur.

coffeescript:

###
    @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

En kolay çözüm, zaten bir etiketiniz varsa veya yoksa çalışır ve eşit etiketleri eklemeye devam etmeyecek şekilde otomatik olarak kaldırır, eğlenin

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

SONRA

changeURL("i=updated");

2

Vianney Bajart'ın cevabı doğrudur; ancak URL yalnızca bağlantı noktası, ana bilgisayar, yol ve sorgu içeren tam URL'niz varsa çalışır:

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

Ve URLSearchParams yalnızca sorgu dizesi geçmesi durumunda çalışacaktır:

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

Eksik veya göreli bir URL'niz varsa ve temel URL'yi önemsemiyorsanız ?, sorgu dizesini almak ve daha sonra şu şekilde katılmak için bölüşebilirsiniz :

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 ile uyumlu değil.


Kullanıyorsanız var u = new URL(window.location), usp = u.searchParams;herhangi bir süslü dize bölme kullanmak zorunda değilsiniz.
amfetamachine

Çözümünüz birçok şey için çalışacak olsa da, parametre değerinde bir soru işareti varsa URL'yi değiştirir:setUrlParams('https://example.com?foo=thing???&bar=baz', 'baz', 'qux') => "https://example.com?foo=thing&baz=qux???&bar=baz"
amphetamachine

1

Bağlantılarda veya başka bir yerde URL'lerle uğraşıyorsanız, karmayı da hesaba katmanız gerekebilir. İşte anlaşılması oldukça basit bir çözüm. Muhtemelen bir regex kullandığından HIZLI değil ... ancak vakaların% 99.999'unda fark gerçekten önemli değil!

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

Birinin neden seni küçümsediğinden emin değilim. Bu, gerekenden çok daha fazla kod olmasına rağmen, daha güvenilir çözümlerden biridir.
Adam Leggett

1

Düşünebildiğim en basit çözüm, değiştirilmiş URI'yi döndürecek olan bu yöntemdir. Çoğunuzun çok fazla çalıştığını hissediyorum.

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

0

Tamam burada, biri kendim (regExp) ve diğeri (annakata) tarafından yapılan iki işlevi karşılaştırıyorum.

Diziyi böl:

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

Normal ifade yöntemi:

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

Test durumu:

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

En basit çözümle bile (regexp sadece test kullandığında ve .replace işlevine girmediğinde), bölünmekten daha yavaş ... Görünüşe göre. Regexp biraz yavaş ama ... ahh ...


Dediğim gibi, bu aslında nispeten yavaş - ve fwiw, document.location.search daha açık
annakata

0

İşte yaptığım şey. EditParams () işlevimi kullanarak, herhangi bir parametre ekleyebilir, kaldırabilir veya değiştirebilirsiniz, ardından URL'yi güncellemek için yerleşik replaceState () işlevini kullanabilirsiniz:

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

En iyi olarak ben yukarıdaki cevapların hiçbiri sorgu dizesi kendilerini bir dizi olan parametreler içeriyor ve dolayısıyla bir kereden fazla görünecektir durumda söyleyemem söyleyebilirim:

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

Aşağıdaki işlev güncellemek için yazdım document.location.search. Bir dizi anahtar / değer çifti dizisini argüman olarak alır ve ikincisinin revize edilmiş bir versiyonunu döndürür ve istediğiniz her şeyi yapabilirsiniz. Bu şekilde kullanıyorum:

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

Mevcut URL:

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

Bu seni alır

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

fonksiyon

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


Düzenli ifadeleri çok yavaş deneyin , böylece:

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

};

Misal:

        // 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'deki yeni başarılarla, URL'ye nasıl sorgu parametresi ekleyebileceğiniz aşağıda açıklanmıştır:

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

Ayrıca bu olasılığı görün Moziila URLSearchParams.append ()


0

Bu, tüm modern tarayıcılarda çalışır.

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

Tüm sorgu dizesini sıfırla

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>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.