2011-12-13 3 views
42

Eventuali duplicati:
Use the get paramater of the url in javascript
Get query string values in JavaScriptCome si analizzano i parametri di una query URL, in Javascript?

in JavaScript, come posso ottenere i parametri di una stringa URL (non l'URL corrente)?

come:

www.domain.com/?v=123&p=hello 

Posso ottenere "v" e "p" in un oggetto JSON?

+2

È possibile controllare questo post sull'argomento http://stackoverflow.com/questions/901115/get-query-string-values-in-javascript –

+0

Ecco un bel little [snippet] (http: //www.onlineaspect.com/2009/06/10/lettura-get-variabili-con-javascript /). – Purag

+0

controlla ans senza espressione regolare http://stackoverflow.com/questions/19491336/get-url-parameter-jquery/21903119?noredirect=1#comment47504324_21903119 –

risposta

73

Oggi (2,5 anni dopo questa risposta) è possibile safely useArray.forEach. Come suggerisce @ricosrealm, in questa funzione è stato utilizzato decodeURIComponent.

function getJsonFromUrl() { 
    var query = location.search.substr(1); 
    var result = {}; 
    query.split("&").forEach(function(part) { 
    var item = part.split("="); 
    result[item[0]] = decodeURIComponent(item[1]); 
    }); 
    return result; 
} 

In realtà non è così semplice, vedere la peer-review nei commenti, in particolare:

  • hash based routing (@cmfolio)
  • parametri array (@ user2368055)
  • uso corretto di decodeURIComponent (@AndrewF)

Forse questo s dovrebbe andare a CodeReview SE, ma qui è più sicuro e codice libero-regexp:

function getJsonFromUrl(hashBased) { 
    var query; 
    if(hashBased) { 
    var pos = location.href.indexOf("?"); 
    if(pos==-1) return []; 
    query = location.href.substr(pos+1); 
    } else { 
    query = location.search.substr(1); 
    } 
    var result = {}; 
    query.split("&").forEach(function(part) { 
    if(!part) return; 
    part = part.split("+").join(" "); // replace every + with space, regexp-free version 
    var eq = part.indexOf("="); 
    var key = eq>-1 ? part.substr(0,eq) : part; 
    var val = eq>-1 ? decodeURIComponent(part.substr(eq+1)) : ""; 
    var from = key.indexOf("["); 
    if(from==-1) result[decodeURIComponent(key)] = val; 
    else { 
     var to = key.indexOf("]",from); 
     var index = decodeURIComponent(key.substring(from+1,to)); 
     key = decodeURIComponent(key.substring(0,from)); 
     if(!result[key]) result[key] = []; 
     if(!index) result[key].push(val); 
     else result[key][index] = val; 
    } 
    }); 
    return result; 
} 

Ho anche sostituito non codificato + per spazio secondo this article che è anche utile guida come codificare aderendo RFC 3986.

Nota il result[key][index] = val: viene creato un nuovo elemento di matrice, esso è enumerabile, quindi può essere iterato dalla chiamata forEach. Pertanto, è possibile analizzare anche gli URL come

var url = "?foo%20e[]=a%20a&foo+e[%5Bx%5D]=b&foo e[]=c"; 
// {"foo e": ["a a", "c", "[x]":"b"]} 

var obj = getJsonFromUrl(url)["foo e"]; 
for(var key in obj) { // Array.forEach would skip string keys here 
    console.log(key,":",obj[key]); 
} 
/* 
    0 : a a 
    1 : c 
    [x] : b 
*/ 
+6

Ogni elemento deve essere decodificato con url decodeURIComponent() – ricosrealm

+0

'posizione. search' non funziona su routing basato su hash: 'http: // localhost: 9000/#/documents? lang = es' restituirà una stringa vuota per' location.search'. Dovresti invece usare 'location.hash' o' location.href'. – cmfolio

+0

questo non funzionerà per i parametri dell'array – user2368055

-16
var v = window.location.getParameter('v'); 
var p = window.location.getParameter('p'); 

ora v e P sono oggetti che hanno 123 e ciao in essi rispettivamente

+7

Nessun metodo [nelle specifiche] (http: //www.w3 .org/TR/finestra/# posizione). – katspaugh

+0

Questo è un metodo in Google Web Toolkit e non in vanilla JS. –

18

Si potrebbe ottenere un oggetto JavaScript (una mappa) dei parametri con qualcosa di simile:

var regex = /[?&]([^=#]+)=([^&#]*)/g, 
    url = window.location.href, 
    params = {}, 
    match; 
while(match = regex.exec(url)) { 
    params[match[1]] = match[2]; 
} 

L'espressione regolare potrebbe molto probabilmente essere migliorata. Cerca semplicemente coppie nome-valore, separate da = caratteri e coppie separate da & caratteri (o un carattere = per il primo). Per il vostro esempio, quanto sopra si tradurrebbe in:

{v: "123", p: "hello"}

Ecco un working example.

+0

perché non usare window.location.getParameter? – codeAnand

+0

L'esempio non restituisce un oggetto (restituisce 2 stringhe) e richiede di conoscere preventivamente i nomi dei parametri, il che, a causa di ciò che l'OP sta tentando di eseguire, è improbabile che sia il caso. Inoltre, dov'è la documentazione di 'getParameter'? –

+2

Il nome param è tecnicamente '[^ = # &] +' piuttosto che solo '[^ = #] +' - avere un nome senza un valore è legale e comune. Verificare inoltre che sia il nome sia il valore siano decodificati: 'params [decodeURIComponent (match [1])] = decodeURIComponent (match [2]);' – AndrewF

Problemi correlati