JavaScript를 사용하여 URL에 매개 변수 추가


276

AJAX 호출을 사용하는 웹 응용 프로그램에서 요청을 제출하지만 URL 끝에 매개 변수를 추가해야합니다.

원래 URL :

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

결과 URL :

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

각 매개 변수를보고있는 URL을 구문 분석 한 후 새 매개 변수를 추가하거나 이미 존재하는 경우 값을 업데이트하는 JavaScript 함수를 찾으십시오.


javascript url 파서 를 검색 하셨습니까? 모든 & 문자로 나눠서 직접 만들 수는 있지만 기존 코드를 사용하는 것이 더 쉽습니다.
csl

1
비슷한 시나리오를 한 번 가졌고 Peter Bromberg 의이 기사 가 매우 유용 하다는 것을 알았습니다 .
Cerebrus

2
window.history.pushState ( 'page2', 'Title', document.location + '/ page2.php'); 페이지를로드하지 않고 작업을 수행합니다
Rutunj sheladiya

1
이 질문에 대한 답변이 더 있습니다 stackoverflow.com/questions/6953944/…
rkb

믿을 수없는 이것은 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
다시 감사합니다. 참조 lessanvaezi.com/wp-content/uploads/2009/01/test.html 방법의 기본적인 비교
Lessan 톨라 바에 지에게

16
escape ()를 사용하여 URL 매개 변수를 이스케이프하는 것은 잘못되었습니다. "+"가 포함 된 값은 깨집니다. 대신 encodeURIComponent를 사용해야합니다. 전체 토론 : xkr.us/articles/javascript/encode-compare
Antonin Hildebrand

4
이 함수를 호출하고 페이지가 무한 루프로 다시로드됩니다. 도와주세요!
sum

6
URL에 매개 변수가없는 경우? & param = value를 얻습니다
Roy Toledo

9
encodeURIComponent오히려 사용 하지 말아야합니까 encodeURI? 그렇지 않으면 모든 문자 좋아 =, &이름이나 값 URI가 손상됩니다에.
Adrian Pronk가

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
나는 예 추가 값을 사용하지 않고 쿼리 매개 변수를 추가 할 XMLhttp://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);-하지만 아무도에서 근무하지 크롬 (63) .
Abdull

2
감사! iOS에서는 아직 지원되지 않습니다. developer.mozilla.org/en-US/docs/Web/API/URLSearchParams
한자

27
너무 나쁜 IE는 지원하지 않습니다.
spedy

3
iOS는 이제 URLSearchParams를 지원합니다 (
@kanji

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기능.
kolobok

5
실제로 확인해야 if (kvp.length==1 && kvp[0]="")합니까?
Charles L.

@CharlesL. 낫다if (document.location.search)
Lyubimov Roman

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

2
@kanzure이 것은 지옥처럼 악해 보이지만 정확히 내가 원하는 것입니다. 감사.
Chad von Nau

왜 단일 문자의 존재를 확인하기 위해 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

@Jay, 왜 수정이 필요한가요? 가정을 확인하십시오. 중복 쿼리 문자열 매개 변수는 중복 양식 필드와 동일하며 합법적입니다. HTML에서 확인란 목록이 구현되는 방식이며, method = get 형식 인 경우 쿼리 문자열을 통해 전달됩니다.
stephen

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가 아닌 다른 것을 지정할 수있는 방법이 마음에
듭니다

1
+1 놀랍게도,이 경우에는 가독성이 미세 최적화보다 중요하다는 데 동의합니다. @Muhd 아마도 그 의견을 쓸 때 JS 엔진의 버그 일지 모르지만이 맥락에서 '$ 1'을 테스트했는데 정상적으로 작동합니다.
JMTyler

값을 바꾸고 싶고 이미 매개 변수가 있으면 문제가 발생하지만 솔루션에 많은 감사드립니다. 대신 & 그것은 $ 1을 씁니다
Codebryo

2
Garrett : 기존 매개 변수를 올바르게 대체하도록 답을 고칠 수 있습니까? 그것은 대체 단지 문제 [\?&]([\?&])정규 표현식에서 (난 그냥 편집 거라고 자신을하지만, 사회 정책이 답변에 버그를 수정 허용 있는지 확실하지 않습니다).
opyh

" domain.tld " 와 같은 URL 에서는 "?"대신 "&"를 추가 할 수 없습니다.
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/


작은 메모리 누수-반환하기 전에 문서에 추가 된 앵커 요소를 제거하려고합니다.
hemp

@freedev, 아니요, 잘 모르겠습니다. ;) 나는 권위있는 출처를 찾는 데 어려움을 겪고 있지만 증거는 당신이 옳다는 것을 암시합니다. 작성된 요소는 DOM에 첨부되지 않으므로 변수가 범위를 벗어나면 정리 해야 합니다. DOM API는 부작용과 관련하여 특히 잘 설계되지 않았으므로 지나치게 신중합니다.
hemp

이 솔루션은 경로에 경로 및 재정렬 매개 변수가없는 URL에 슬래시를 추가합니다.이 매개 변수는 불필요하고 바람직하지 않은 변경입니다. 또한 값이없는 기존 매개 변수를 바꾸지 않고 추가합니다 (예 :) http://abc.def/?a&b&b.
Adam Leggett

@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가 키이고 두 번째 agrument가 값입니다.


1
이것의 단순함을 좋아하고 기본 브라우저 방법을 사용한다는 점
Juan Solano

2
이것은 정답이며 투표권이 있어야합니다. 이 새로운 API는 URL 처리를위한 결정적인 요소입니다.
Anthony

8

매개 변수로 장식하려는 url이있는 문자열이 있으면 다음을 시도하십시오.

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

이것은 의미 합니까? 매개 변수의 접두사가되지만 이미 ? 에서 &urlstring 보다 접두사가됩니다.

encodeURI( paramvariable )매개 변수를 하드 코딩하지 않은 경우 에도 권장 하지만 매개 변수는 paramvariable; 또는 재미있는 캐릭터가 있다면.

함수 사용법은 javascript URL 인코딩 을 참조하십시오 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 및 쿼리 문자열 조작.

이 프로젝트는 Steven Levithan의 우수한 parseUri 정규 표현식 라이브러리를 통합합니다. 모든 모양과 크기의 URL을 유효하게 구문 분석 할 수 있지만 유효하지 않거나 무시할 수 있습니다.


404-이 서버에서 요청한 URL / p / jsuri /를 찾을 수 없습니다. 그게 우리가 아는 전부 야.
Aligma

1
움직 인 것 같습니다. URL을 업데이트했습니다. 행운을 빕니다!
Charlie Liang Yuan

링크뿐만 아니라 답변에 관련 세부 정보를 포함 시키십시오.
jhpratt GOFUNDME 라이센스 갱신

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

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

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

또한 stackoverflow의 다른 게시물 에서이 jQuery 플러그인을 찾았으며 더 많은 유연성이 필요하면 다음을 사용할 수 있습니다 .http : //plugins.jquery.com/project/query-object

나는 코드가 테스트 될 것이라고 생각할 것이다.

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

코드를 공유해 주셔서 감사합니다. Lessan. 나는 이것을 사용하고 있었고 훌륭하게 작동했습니다! 나는 내 자신의 버전의 요점을 업로드하고 약간 간결하게 편집하고 JSHint 유효성 검사를 통과했습니다. gist.github.com/jonathanconway/02a183920506acd9890a
Jonathan

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객체에 대해 사전 초기화 된 매개 변수 목록입니다 .
amphetamachine

2

나는 Mehmet Fatih Yıldız의 답변조차도 전체 질문에 대답하지 않았습니다.

그의 대답과 같은 줄에 다음 코드를 사용합니다.

"매개 변수 존재를 제어하지 않으며 기존 값을 변경하지 않습니다. 끝에 매개 변수를 추가합니다"

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

이것은 Node.js와 같은 서버 측의 기본 URL 매개 변수 추가 또는 업데이트와 관련하여 사용하는 것입니다.

커피 스크립트 :

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

자바 스크립트 :

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

Vianney Bajart의 대답 은 맞습니다. 그러나 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;당신은 어떤 멋진 문자열 분할을 사용할 필요가 없습니다.
amphetamachine

솔루션은 대부분의 경우 작동하지만 매개 변수 값에 물음표가 있으면 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;
    }
}

왜 누군가가 당신을 억압했는지 모르겠습니다. 이것은 필요한 것보다 훨씬 많은 코드이지만 더 안정적인 솔루션 중 하나입니다.
Adam Leggett

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

정규식 방법 :

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가 테스트 만 사용하고 .replace 기능을 입력하지 않은 경우)에도 여전히 분할보다 느립니다. 정규 표현식은 다소 느리지 만 ...


내가 언급했듯이, 이것은 실제로 비교적 느리다-문서 .location.search가 더 명확하다
annakata

0

여기 내가하는 일이 있습니다. editParams () 함수를 사용하면 매개 변수를 추가, 제거 또는 변경할 수 있으며 내장 된 replaceState () 함수를 사용하여 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>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.