jQuery / Javascript (querystring)로 쿼리 문자열 매개 변수 URL 값 가져 오기


149

누구나 쿼리 문자열 매개 변수를 처리하기 위해 jQuery 확장을 작성하는 좋은 방법을 알고 있습니까? 기본적으로 jQuery 매직 ($)기능 을 확장하여 다음과 같이 할 수 있습니다.

$('?search').val(); 

다음 URL에서 "test"값을 제공합니다 http://www.example.com/index.php?search=test.

jQuery와 Javascript 에서이 작업을 수행 할 수있는 많은 기능을 보았지만 실제로는 위에 표시된 그대로 작동하도록 jQuery를 확장하고 싶습니다. jQuery 플러그인을 찾지 않고 jQuery 메소드의 확장을 찾고 있습니다.



1
@NicoWesterdale-나는 그 링크를 겪었지만이 특정 질문을 해결하는 답변을 보지 못했습니다. 그는 위와 같이 정확하게 원한다고 말했다.
mrtsherman

2
나는 당신이 이것을 할 수 있다고 생각하지 않는다. 전달 된 문자열은 시즐러에 의해 구문 분석되고 DOM 객체 배열로 해석된다. 매처를 확장하여 사용자 정의 필터를 제공 할 수 있지만 문자열을 기반으로 jquery 객체를 가질 수는 없습니다.
Andrew

6
$과부하 가되지 않습니까?
Quentin

1
@mrtsherman 내가 제공 한 링크에서 getParameterByName () 함수를보십시오. 아니요 $ 프롬프트 내에서 직접 수행 할 수는 없지만 jQuery 선택기가 아닙니다. 그는 URL 문자열의 일부만 선택하고 $ ()가하는 DOM의 일부에 액세스하려고하지 않습니다. 완전히 다른 것입니다. jQuery를 정말로 사용하고 싶다면 $ .getParameterByName (param) 구문을 사용하는 플러그인을 작성할 수 있습니다. 그 페이지에 아래 예제가 나와 있습니다. 그래도 무의미합니다.
Nico Westerdale

답변:


46

수년간의 추악한 문자열 구문 분석 후에 더 좋은 방법이 있습니다. URLSearchParams 이 새로운 API를 사용하여 위치에서 값을 얻는 방법을 살펴 보겠습니다!

// "? post = 1234 & action = edit"가정

var urlParams = new URLSearchParams(window.location.search);
console.log(urlParams.has('post')); // true
console.log(urlParams.get('action')); // "edit"
console.log(urlParams.getAll('action')); // ["edit"]
console.log(urlParams.toString()); // "?post=1234&action=edit"
console.log(urlParams.append('active', '1')); // "?

post=1234&action=edit&active=1"

업데이트 : IE는 지원되지 않습니다

URLSearchParams 대신 아래 답변 에서이 기능을 사용하십시오.

$.urlParam = function (name) {
    var results = new RegExp('[\?&]' + name + '=([^&#]*)')
                      .exec(window.location.search);

    return (results !== null) ? results[1] || 0 : false;
}

console.log($.urlParam('action')); //edit

1
모든 브라우저에서 URLSearchParams를 지원합니까?
신성한

죄송합니다! 오, IE는 지원되지 않습니다 !! 방금 테스트했습니다. Chrome, FF, Safari에는 문제가 없습니다.
Saurin

1
@divine-URLSearchParams에 대한 polyfill이 있습니다 : github.com/WebReflection/url-search-params
Roberto

지원되지 않는 브라우저에 폴리 필을 추가하면이 URLSearchParams 솔루션이 제대로 작동합니다. github.com/ungap/url-search-params
Louisvdw

104

왜 jQuery를 확장해야합니까? jQuery를 확장하고 전역 기능을 갖는 것의 이점은 무엇입니까?

function qs(key) {
    key = key.replace(/[*+?^$.\[\]{}()|\\\/]/g, "\\$&"); // escape RegEx meta chars
    var match = location.search.match(new RegExp("[?&]"+key+"=([^&]+)(&|$)"));
    return match && decodeURIComponent(match[1].replace(/\+/g, " "));
}

http://jsfiddle.net/gilly3/sgxcL/

다른 방법은 전체 쿼리 문자열을 구문 분석하고 나중에 사용할 수 있도록 개체에 값을 저장하는 것입니다. 이 접근법은 정규 표현식을 요구하지 않고 window.location객체를 확장 하지만 전역 변수를 쉽게 사용할 수 있습니다.

location.queryString = {};
location.search.substr(1).split("&").forEach(function (pair) {
    if (pair === "") return;
    var parts = pair.split("=");
    location.queryString[parts[0]] = parts[1] &&
        decodeURIComponent(parts[1].replace(/\+/g, " "));
});

http://jsfiddle.net/gilly3/YnCeu/

이 버전은 또한 Array.forEach()IE7 및 IE8에서 기본적으로 사용할 수없는를 사용합니다. MDN의 구현을 사용하여 추가 하거나 jQuery를 $.each()대신 사용할 수 있습니다 .


2
일반적이지 않지만 쿼리 매개 변수에 앰퍼샌드 대신 세미콜론을 사용하는 것이 유효합니다.
Muhd

@Muhd-코드가 이해하는 한 쿼리 문자열에서 원하는 구분 기호를 사용하는 것이 "유효합니다". 그러나 양식을 제출하면 양식 필드는로 name=value구분 된 쌍 으로 제출 됩니다 &. 코드에서 사용자 지정 쿼리 문자열 형식을 사용하는 경우 서버 나 클라이언트에서 쿼리 문자열이 사용되는 모든 위치에 사용자 지정 쿼리 문자열 구문 분석기를 작성해야합니다.
gilly3

2
@nick-흥미 롭습니다. 그러나 세미콜론을 앰퍼샌드로 취급하는 HTTP 서버에 대한 제안은 양식 제출을 모방하기 위해 링크를 사용할 때 HTML을 더 예쁘게 만드는 역할을합니다. 그것은 단지 제안 일 뿐이며 비표준입니다. 표준 양식 GET제출은로 application/x-www-form-urlencoded구분 된 값과 함께 로 인코딩 됩니다 &. 내 코드는 그 표준을 처리합니다. 링크 한 것과 같은 사용자 정의 URL 구조에는 사용자 정의 구문 분석기 서버 측 및 클라이언트 측이 필요합니다. 그럼에도 불구하고 위의 코드에 이러한 기능을 추가하는 것은 쉽지 않습니다.
gilly3

1
@gilly 실제로-휴대용 코드를 원한다면 두 가지 모두를 지원해야합니다.
nick

1
키가 대소 문자를 구분하지 않도록 Regip ()에 "i"를 추가하십시오. new RegExp ( "[? &]"+ key + "= ([^ &] +) (& | $)", "i"));
Yovav December

94

JQuery jQuery-URL-Parser 플러그인은 동일한 작업을 수행합니다. 예를 들어 검색어 문자열 매개 변수 의 값을 검색 하려면

$.url().param('search');

이 라이브러리는 적극적으로 유지 관리되지 않습니다. 동일한 플러그인의 작성자가 제안한대로 URI.js 를 사용할 수 있습니다 .

또는 대신 js-url을 사용할 수 있습니다 . 아래의 것과 매우 유사합니다.

따라서 다음과 같은 쿼리 매개 변수에 액세스 할 수 있습니다 $.url('?search')


2
좋은. 코드는 공개 도메인에 있으므로 주석을 포함하지 않아도됩니다.
Muhd

4
좋은 해결책이지만 file : //을 통해 테스트하는 경우 작동하지 않습니다.
kampsj

1
@kampsj
RameshVel 님

3
안녕하세요 @ kampsj, file://프로토콜로 테스트 하면 더 많은 것들이 작동하지 않을 것입니다. node.js를 사용하여 매우 빠르고 쉬운 정적 HTML 서버를 만들 수 있습니다. stackoverflow.com/questions/16333790/…
Jess

2
이 플러그인은 더 이상 유지 관리되지 않으며 작성자 자체가 다른 플러그인을 대신 사용할 것을 제안합니다.
JanErikGunnar

77

SitePoint에서 친구들로부터이 보석을 찾았습니다. https://www.sitepoint.com/url-parameters-jquery/ .

PURE jQuery 사용 방금 이것을 사용했고 효과가있었습니다. 예를 들어 그것을 약간 조정했습니다.

//URL is http://www.example.com/mypage?ref=registration&email=bobo@example.com

$.urlParam = function (name) {
    var results = new RegExp('[\?&]' + name + '=([^&#]*)')
                      .exec(window.location.search);

    return (results !== null) ? results[1] || 0 : false;
}

console.log($.urlParam('ref')); //registration
console.log($.urlParam('email')); //bobo@example.com

당신이 원하는대로 사용하십시오.


큰. 감사! 그래도 마지막 닫는 중괄호 태그가 필요하다고 생각하지 않습니다.
bhtabor

네, 맞습니다. 게시물을 수정했습니다. 그것은 내 코드의 일부 if 문에서 남았습니다. 감사.
ClosDesign

1
.href 대신 window.location.search를 사용해야합니다. 그렇지 않으면 좋습니다.
BrainSlugs83

4
대신 results[1] || 0, if (결과) {return results [1]}이 0을 반환해야합니다. bcoz 쿼리 매개 변수가 전혀 없을 수 있습니다. 수정은 모든 일반적인 경우를 처리합니다.
myDoggyWritesCode

1
당신이 같은 것을 가지고 있다면 어떻게합니까 https://example.com/?c=Order+ID? 그 더하기 부호는 여전히이 기능에 남아 있습니다.
Volomike

47

이것은 내 코드 샘플이 아니지만 과거에 사용했습니다.

//First Add this to extend jQuery

    $.extend({
      getUrlVars: function(){
        var vars = [], hash;
        var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
        for(var i = 0; i < hashes.length; i++)
        {
          hash = hashes[i].split('=');
          vars.push(hash[0]);
          vars[hash[0]] = hash[1];
        }
        return vars;
      },
      getUrlVar: function(name){
        return $.getUrlVars()[name];
      }
    });

    //Second call with this:
    // Get object of URL parameters
    var allVars = $.getUrlVars();

    // Getting URL var by its name
    var byName = $.getUrlVar('name');

2
'='로 나누면 안됩니다. 기술적으로 키 / 값 쌍의 값에 두 번째 등호를 사용하는 것이 좋습니다. -첫 번째 등호 (키 / 값 쌍당) 만 구분 기호로 취급해야합니다. (또한 등호는 엄격하게 요구되는 것은 아니며 값이없는 키를 가질 수 있습니다.)
BrainSlugs83

깨끗한 용액. 내 경우에는 완벽하게 작동했습니다.
JF Gagnon

$ .extend ({getUrlVars : function () {var vars = [], hash; var hashes = window.location.href.slice (window.location.href.indexOf ( '?') + 1) .split ( '& '); for (var i = 0; i <hashes.length; i ++) {hash = hashes [i] .split ('= '); var k = hash.shift (); vars.push (k); vars [k] = hash.join ( "");} return vars;}, getUrlVar : function (name) {return $ .getUrlVars () [name];}});
Mupinc

15

쿼리 매개 변수의 이름 만 구문 분석 해야하는 작은 함수를 작성했습니다. 따라서? Project = 12 & Mode = 200 & date = 2013-05-27이 있고 'Mode'매개 변수를 원하면 'Mode'이름 만 함수로 구문 분석하면됩니다.

function getParameterByName( name ){
    var regexS = "[\\?&]"+name+"=([^&#]*)", 
  regex = new RegExp( regexS ),
  results = regex.exec( window.location.search );
  if( results == null ){
    return "";
  } else{
    return decodeURIComponent(results[1].replace(/\+/g, " "));
  }
}

// example caller:
var result =  getParameterByName('Mode');

이름이 더 쓰레기가없는 경우, 첫 번째 정규 표현식을 삭제할 수 있으며 location.search에서 시작하는 더 이해하기
mplungjan

7

위의 @Rob Neild의 대답을 바탕으로, 여기에는 디코딩 된 쿼리 문자열 매개 변수의 간단한 객체 (% 20 등 없음)를 반환하는 순수한 JS 적응이 있습니다.

function parseQueryString () {
  var parsedParameters = {},
    uriParameters = location.search.substr(1).split('&');

  for (var i = 0; i < uriParameters.length; i++) {
    var parameter = uriParameters[i].split('=');
    parsedParameters[parameter[0]] = decodeURIComponent(parameter[1]);
  }

  return parsedParameters;
}

이 코드를 사용하는 동안 오류가 발생하지 않았습니다. 어떤 브라우저를 사용하고 있습니까? 현재 Firefox, Chrome 및 Safari에서 테스트했습니다.

그래, 내가 잘못 읽어서 미안해 나는 그것이 정의되지 않은 것을 리턴하는 메소드를 호출하는 것을 보았다고 생각했다. 따라서 실제로 필요하지 않을 때 한 번만 실행됩니다. 검색이 ""입니다. 그리고 당신은 { "": "undefined"}
Jerinaw

네. 아마 약간의 정제가 필요할 것입니다.

1

바닐라 자바 ​​스크립트로 작성

     //Get URL
     var loc = window.location.href;
     console.log(loc);
     var index = loc.indexOf("?");
     console.log(loc.substr(index+1));
     var splitted = loc.substr(index+1).split('&');
     console.log(splitted);
     var paramObj = [];
     for(var i=0;i<splitted.length;i++){
         var params = splitted[i].split('=');
         var key = params[0];
         var value = params[1];
         var obj = {
             [key] : value
         };
         paramObj.push(obj);
         }
    console.log(paramObj);
    //Loop through paramObj to get all the params in query string.

1
function parseQueryString(queryString) {
    if (!queryString) {
        return false;
    }

    let queries = queryString.split("&"), params = {}, temp;

    for (let i = 0, l = queries.length; i < l; i++) {
        temp = queries[i].split('=');
        if (temp[1] !== '') {
            params[temp[0]] = temp[1];
        }
    }
    return params;
}

나는 이것을 사용합니다.

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