2009-05-02 19 views

Odpowiedz

47
function parseURLParams(url) { 
    var queryStart = url.indexOf("?") + 1, 
     queryEnd = url.indexOf("#") + 1 || url.length + 1, 
     query = url.slice(queryStart, queryEnd - 1), 
     pairs = query.replace(/\+/g, " ").split("&"), 
     parms = {}, i, n, v, nv; 

    if (query === url || query === "") return; 

    for (i = 0; i < pairs.length; i++) { 
     nv = pairs[i].split("=", 2); 
     n = decodeURIComponent(nv[0]); 
     v = decodeURIComponent(nv[1]); 

     if (!parms.hasOwnProperty(n)) parms[n] = []; 
     parms[n].push(nv.length === 2 ? v : null); 
    } 
    return parms; 
} 

Zastosowanie następująco:

var urlString = "http://www.foo.com/bar?a=a+a&b%20b=b&c=1&c=2&d#hash"; 
    urlParams = parseURLParams(urlString); 

która zwraca obiekt tak:

{ 
    "a" : ["a a"],  /* param values are always returned as arrays */ 
    "b b": ["b"],  /* param names can have special chars as well */ 
    "c" : ["1", "2"] /* an URL param can occur multiple times!  */ 
    "d" : [null]  /* parameters without values are set to null */ 
} 

So

parseURLParams("www.mints.com?name=something") 

daje

{name: ["something"]} 

EDIT: The original version of this answer stosować podejście oparte na regex do URL-parsowania. Używał krótszej funkcji, ale podejście było wadliwe i zastąpiłem go odpowiednim parserem.

+0

Moje przeprosiny, nie jestem profesjonalnym javascripter! :) –

+0

@ Tomalak czy możesz mi powiedzieć, jak wydrukować wartość nazwy? Próbuję użyć tego skryptu i kiedy używam document.write (urlParams); to daje mi [obiekt obiekt] , ale nie dostać rzeczywistej wartości .. Czy możesz mi pomóc z tym proszę? –

+0

@KiranVemuri: Wypróbuj 'console.log (JSON.stringify (urlParams))' – Daenarys

3

Oto jedno rozwiązanie. Oczywiście ta funkcja nie musi być ładowana do opcji "window.params", którą można dostosować.

window.params = function(){ 
    var params = {}; 
    var param_array = window.location.href.split('?')[1].split('&'); 
    for(var i in param_array){ 
     x = param_array[i].split('='); 
     params[x[0]] = x[1]; 
    } 
    return params; 
}(); 

Przykład wywołania API na http://www.mints.com/myurl.html?name=something&goal=true:

if(window.params.name == 'something') doStuff(); 
else if(window.params.goal == 'true') shoutGOOOOOAAALLL(); 
5

myślę, że to powinno również pracować:

function $_GET(q,s) { 
    s = (s) ? s : window.location.search; 
    var re = new RegExp('&amp;'+q+'=([^&amp;]*)','i'); 
    return (s=s.replace(/^\?/,'&amp;').match(re)) ?s=s[1] :s=''; 
} 

Wystarczy nazwać tak:

var value = $_GET('myvariable'); 
1

Iv'e poprawiono/poprawiłem odpowiedź Tomalaka z:

  • Utwórz tablicę tylko w razie potrzeby.
  • Jeśli istnieje inny symbol równania w wartości, która dostaje się do wartości
  • Teraz używa wartości location.search zamiast adresu URL.
  • Pusty ciąg wyszukiwania powoduje pusty obiekt.

Kod:

function getSearchObject() { 
    if (location.search === "") return {}; 

    var o = {}, 
     nvPairs = location.search.substr(1).replace(/\+/g, " ").split("&"); 

    nvPairs.forEach(function (pair) { 
     var e = pair.indexOf('='); 
     var n = decodeURIComponent(e < 0 ? pair : pair.substr(0,e)), 
      v = (e < 0 || e + 1 == pair.length) 
       ? null : 
       decodeURIComponent(pair.substr(e + 1,pair.length - e)); 
     if (!(n in o)) 
      o[n] = v; 
     else if (o[n] instanceof Array) 
      o[n].push(v); 
     else 
      o[n] = [o[n] , v]; 
    }); 
    return o; 
} 
0

ja też mad dość prosta funkcja. Zadzwonisz pod numer: get ("yourgetname");

i uzyskaj wszystko, co było. (teraz, że napisałem go zauważyłem, to daje 26% jeśli miał & w swojej wartości ..)

function get(name){ 
    var url = window.location.search; 
    var num = url.search(name); 
    var namel = name.length; 
    var frontlength = namel+num+1; //length of everything before the value 
    var front = url.substring(0, frontlength); 
    url = url.replace(front, ""); 
    num = url.search("&"); 

if(num>=0) return url.substr(0,num); 
if(num<0) return url;    
} 
1

Aktualnie wybrana odpowiedź nie działa dobrze w ogóle w moim przypadku, co czuję jest dość typowy. Znalazłem poniższą funkcję here i działa świetnie!

function getAllUrlParams(url) { 

    // get query string from url (optional) or window 
    var queryString = url ? url.split('?')[1] : window.location.search.slice(1); 

    // we'll store the parameters here 
    var obj = {}; 

    // if query string exists 
    if (queryString) { 

    // stuff after # is not part of query string, so get rid of it 
    queryString = queryString.split('#')[0]; 

    // split our query string into its component parts 
    var arr = queryString.split('&'); 

    for (var i=0; i<arr.length; i++) { 
     // separate the keys and the values 
     var a = arr[i].split('='); 

     // in case params look like: list[]=thing1&list[]=thing2 
     var paramNum = undefined; 
     var paramName = a[0].replace(/\[\d*\]/, function(v) { 
     paramNum = v.slice(1,-1); 
     return ''; 
     }); 

     // set parameter value (use 'true' if empty) 
     var paramValue = typeof(a[1])==='undefined' ? true : a[1]; 

     // (optional) keep case consistent 
     paramName = paramName.toLowerCase(); 
     paramValue = paramValue.toLowerCase(); 

     // if parameter name already exists 
     if (obj[paramName]) { 
     // convert value to array (if still string) 
     if (typeof obj[paramName] === 'string') { 
      obj[paramName] = [obj[paramName]]; 
     } 
     // if no array index number specified... 
     if (typeof paramNum === 'undefined') { 
      // put the value on the end of the array 
      obj[paramName].push(paramValue); 
     } 
     // if array index number specified... 
     else { 
      // put the value at that index number 
      obj[paramName][paramNum] = paramValue; 
     } 
     } 
     // if param name doesn't exist yet, set it 
     else { 
     obj[paramName] = paramValue; 
     } 
    } 
    } 

    return obj; 
} 
+0

tutaj, ten działa jak urok – Plastic

Powiązane problemy