Ottieni il parametro URL di escape


302

Sto cercando un plug-in jQuery in grado di ottenere i parametri URL e supportare questa stringa di ricerca senza generare l'errore JavaScript: "sequenza URI non valida". Se non esiste un plug-in jQuery che supporti questo, devo sapere come modificarlo per supportarlo.

?search=%E6%F8%E5

Il valore del parametro URL, quando decodificato, dovrebbe essere:

æøå

(i personaggi sono norvegesi).

Non ho accesso al server, quindi non posso modificare nulla su di esso.



1
Il motivo per cui si ottiene "sequenza URI non valida" è perché la maggior parte delle funzioni utilizza decodeURIComponent(). I personaggi norvegesi sono stati probabilmente codificati usando qualcosa di simile escape()e cambiando la decodeURIComponent()chiamata in un unescape()dovrebbe aiutare.
Kevin M,

Vedere la mia risposta per una soluzione moderna: stackoverflow.com/a/19992436/64949
Sindre Sorhus

Risposte:


418
function getURLParameter(name) {
    return decodeURI(
        (RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1]
    );
}

33
Con name = 'bar', penso che questo regexp corrisponderebbe 'foobar=10'e ritornerebbe '10'. Forse potresti aggiungere '[?|&]'all'inizio del tuo regexp. Saluti!
Sébastien RoccaSerra,

34
questa funzione restituisce 'null' anziché null quando il parametro non è definito ... la gioia di js ...
Damien,

12
potresti voler "decodeURIComponent ()" invece di "decodeURI ()", specialmente se stai passando dati interessanti come URL di ritorno come parametro URL
perfezionista

25
Questo è buono, ma decodeURIComponent è migliore, ad esempio avevo un hashtag (% 23) nel mio parametro che sarebbe stato ignorato da decodeURI. E non vorrei restituire null, ma "", perché decodeURI (null) === "null", che è un valore di ritorno strano, "" è migliore; puoi fare if (! getURLParameter ("param")) invece di if (getURLParameter ("param") === "null"). Quindi, la mia versione migliorata: decodeURIComponent ((RegExp (name + '=' + '(. +?) (& | $)'). Exec (location.search) || [, ""]) [1])
standup75

3
Down ha votato come questo restituisce una stringa, non importa se il risultato è stato trovato o meno, e non importa quello che hai messo come array alternativo, ad esempio [, null], perché il risultato è stato racchiuso in decodeURI che ha trasformato qualsiasi cosa in stringa, Sanjeev aveva ragione ma il suo codice non è stato testato correttamente e il semplice copia e incolla non funziona. function getURLParameter(name) { var p = RegExp(name + '=' + '(.+?)(&|$)').exec(location.search); if(!!p) { p = decodeURI(p[1]); } return p; }
Lukasz "Severiaan" Grela,

295

Di seguito è riportato ciò che ho creato dai commenti qui, oltre a correggere bug non menzionati (come effettivamente restituire null e non "null"):

function getURLParameter(name) {
    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
}

6
Che ne dici di aggiungere newdavanti a RegExp? Avvisi meno lanugine.
ripper234

18
Questa dovrebbe essere la risposta accettata. Ottenere il vero null indietro invece di "null" è molto meglio.
Art

11
Se qualcuno ha bisogno di questo convertito in coffeescript: getURLParameter: (name) -> return decodeURIComponent ((new RegExp ("[? | &] # {Name} = ([^ &;] +?) (& | ## |; | $) "). exec (location.search) || [null," "]) [1] .replace (/ \ + / g, '% 20')) || null;
Barbanera,

1
@Redbeard - La tua funzione non dovrebbe avere un segno '=' dopo la definizione del metodo anziché un doppio punto?
Zippie,

1
Questa è l'unica versione di una funzione di parametro get-URL che funziona per me con una stringa UTF8.
sicuramente il

107

Quello che vuoi davvero è il plug-in Parser URL jQuery . Con questo plugin, ottenere il valore di un parametro URL specifico (per l'URL corrente) è simile al seguente:

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

Se vuoi un oggetto con nomi di parametro come chiavi e valori di parametro come valori, chiameresti param()senza un argomento, come questo:

$.url().param();

Questa libreria funziona anche con altri URL, non solo quello corrente:

$.url('http://allmarkedup.com?sky=blue&grass=green').param();
$('#myElement').url().param(); // works with elements that have 'src', 'href' or 'action' attributes

Poiché si tratta di un'intera libreria di analisi dell'URL, puoi anche ottenere altre informazioni dall'URL, come la porta specificata, il percorso, il protocollo ecc:

var url = $.url('http://allmarkedup.com/folder/dir/index.html?item=value');
url.attr('protocol'); // returns 'http'
url.attr('path'); // returns '/folder/dir/index.html'

Ha anche altre funzionalità, controlla la sua homepage per ulteriori documenti ed esempi.

Invece di scrivere il proprio parser URI per questo scopo specifico che genere di opere in maggior parte dei casi, utilizzare un parser reale URI. A seconda della risposta, il codice di altre risposte può restituire 'null'invece di null, non funziona con parametri vuoti ( ?foo=&bar=x), non può analizzare e restituire tutti i parametri contemporaneamente, ripete il lavoro se si interrogano ripetutamente l'URL per parametri ecc.

Usa un vero parser URI, non inventare il tuo.

Per chi è contrario a jQuery, esiste una versione del plugin che è JS puro .


23
La domanda è "ottieni il parametro URL con jQuery". La mia risposta risponde alla domanda. Altre risposte indicano all'utente di scrivere il proprio parser URI per questo specifico caso d'uso, che è una pessima idea. L'analisi degli URI è più complicata di quanto la gente pensi.
Lucas,

2
Questa è la risposta che stavo cercando, ed è molto jQuery-ish, a differenza di alcune delle altre risposte.
Ehtesh Choudhury,

Il plugin gestisce la codifica URI o devo decodificarla manualmente?
Roberto Linares,

La domanda dice "javascript" (penso che significhi direttamente il DOM) o jQuery. Quindi uno qualsiasi degli altri lo farà.
brunoais,

43

Se non sai quali saranno i parametri URL e desideri ottenere un oggetto con le chiavi e i valori che si trovano nei parametri, puoi utilizzare questo:

function getParameters() {
  var searchString = window.location.search.substring(1),
      params = searchString.split("&"),
      hash = {};

  if (searchString == "") return {};
  for (var i = 0; i < params.length; i++) {
    var val = params[i].split("=");
    hash[unescape(val[0])] = unescape(val[1]);
  }
  return hash;
}

Chiamare getParameters () con un URL come /posts?date=9/10/11&author=nilbussarebbe restituito:

{
  date:   '9/10/11',
  author: 'nilbus'
}

Non includerò il codice qui poiché è ancora più lontano dalla domanda, ma weareon.net ha pubblicato una libreria che consente anche la manipolazione dei parametri nell'URL:


1
Sì, è meglio ottenere tutti i parametri. Tutte le altre soluzioni elencate qui ripetono la regex per ogni parametro.
Bernard,

Questa funzione restituisce un oggetto scomodo: {"": undefined}quando l'URL è privo di parametri. Meglio restituire un oggetto vuoto usando if(searchString=='') return {};direttamente dopo l' searchStringassegnazione.
Jordan Arseno,

40

È possibile utilizzare la proprietà location.search nativa del browser :

function getParameter(paramName) {
  var searchString = window.location.search.substring(1),
      i, val, params = searchString.split("&");

  for (i=0;i<params.length;i++) {
    val = params[i].split("=");
    if (val[0] == paramName) {
      return unescape(val[1]);
    }
  }
  return null;
}

Ma ci sono alcuni plugin jQuery che possono aiutarti:


4
Questo è molto più pulito e più leggibile (e probabilmente più privo di bug) di tutti quei regex one-liners.
Timmmm,

8
Suggerirò di usare decodeURIComponent () invece di unescape ()
freedev

+1 funziona per i browser moderni ma alcuni sviluppatori devono lavorare con ...: | IE8: S.
brunoais,

25

Basato sulla risposta del 999 :

function getURLParameter(name) {
    return decodeURIComponent(
        (location.search.match(RegExp("[?|&]"+name+'=(.+?)(&|$)'))||[,null])[1]
    );  
}

I cambiamenti:

  • decodeURI() è sostituito da decodeURIComponent()
  • [?|&] viene aggiunto all'inizio del regexp

3
Potrebbe essere utile per gli altri se potessi spiegare perché hai apportato queste modifiche. Grazie
Timm

3
Non gestire params vuote: ?a=&b=1. Meglio regexp sarebbe:"[?&]"+name+"=([^&]*)"
serg

6

È necessario aggiungere il parametro i per renderlo maiuscolo / minuscolo:

  function getURLParameter(name) {
    return decodeURIComponent(
      (RegExp(name + '=' + '(.+?)(&|$)', 'i').exec(location.search) || [, ""])[1]
    );
  }

3

Dopo aver letto tutte le risposte ho finito con questa versione con + una seconda funzione per usare i parametri come flag

function getURLParameter(name) {
    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)','i').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
}

function isSetURLParameter(name) {
    return (new RegExp('[?|&]' + name + '(?:[=|&|#|;|]|$)','i').exec(location.search) !== null)
}

2
Buona risposta, tuttavia solo un avvertimento. Per JSHint, [, ""] può causare problemi per i browser meno recenti. Quindi, utilizzare invece [null, ""] o [undefined, ""]. Ci sono ancora alcuni di noi infelici che supportano IE8 e osano dirlo IE7.
Delicia Brummitt,

2
$.urlParam = function(name){
  var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(top.window.location.href); 
  return (results !== null) ? results[1] : 0;
}

$.urlParam("key");

2

Ad esempio, una funzione che restituisce il valore di qualsiasi variabile di parametro.

function GetURLParameter(sParam)
{
    var sPageURL = window.location.search.substring(1);
    var sURLVariables = sPageURL.split('&');
    for (var i = 0; i < sURLVariables.length; i++)
    {
        var sParameterName = sURLVariables[i].split('=');
        if (sParameterName[0] == sParam)
        {
            return sParameterName[1];
        }
    }
}​

Ed è così che puoi usare questa funzione supponendo che l'URL sia,

"Http://example.com/?technology=jquery&blog=jquerybyexample".

var tech = GetURLParameter('technology');
var blog = GetURLParameter('blog');

Quindi nella variabile di codice sopra "tech" avrà "jQuery" come valore e la variabile "blog" sarà "jquerybyexample".


2

Non dovresti usare jQuery per qualcosa del genere!
Il modo moderno è usare piccoli moduli riutilizzabili attraverso un gestore di pacchetti come Bower.

Ho creato un piccolo modulo in grado di analizzare la stringa di query in un oggetto. Usalo in questo modo:

// parse the query string into an object and get the property
queryString.parse(unescape(location.search)).search;
//=> æøå

Se stai dicendo che non è moderno avere un framework, va bene. Ma secondo me i quadri hanno davvero il loro posto. jQuery mi sembra sempre meno carina.
Lodewijk,

0

C'è un sacco di buggy code qui e le soluzioni regex sono molto lente. Ho trovato una soluzione che funziona fino a 20 volte più veloce della controparte regex ed è elegantemente semplice:

    /*
    *   @param      string      parameter to return the value of.
    *   @return     string      value of chosen parameter, if found.
    */
    function get_param(return_this)
    {
        return_this = return_this.replace(/\?/ig, "").replace(/=/ig, ""); // Globally replace illegal chars.

        var url = window.location.href;                                   // Get the URL.
        var parameters = url.substring(url.indexOf("?") + 1).split("&");  // Split by "param=value".
        var params = [];                                                  // Array to store individual values.

        for(var i = 0; i < parameters.length; i++)
            if(parameters[i].search(return_this + "=") != -1)
                return parameters[i].substring(parameters[i].indexOf("=") + 1).split("+");

        return "Parameter not found";
    }

console.log(get_param("parameterName"));

Regex non è la soluzione completa, poiché per questo tipo di problema la semplice manipolazione delle stringhe può funzionare in modo molto più efficiente. Codice sorgente .


0
<script type="text/javascript">
function getURLParameter(name) {
        return decodeURIComponent(
            (location.search.toLowerCase().match(RegExp("[?|&]" + name + '=(.+?)(&|$)')) || [, null])[1]
        );
    }

</script>

getURLParameter(id)o getURLParameter(Id)funziona allo stesso modo:)


0

Frammento di codice jQuery per ottenere le variabili dinamiche archiviate nell'URL come parametri e memorizzarle come variabili JavaScript pronte per l'uso con gli script:

$.urlParam = function(name){
    var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
    if (results==null){
       return null;
    }
    else{
       return results[1] || 0;
    }
}

example.com?param1=name&param2=&id=6

$.urlParam('param1'); // name
$.urlParam('id');        // 6
$.urlParam('param2');   // null

//example params with spaces
http://www.jquery4u.com?city=Gold Coast
console.log($.urlParam('city'));  
//output: Gold%20Coast

console.log(decodeURIComponent($.urlParam('city'))); 
//output: Gold Coast

-1
function getURLParameters(paramName) 
{
        var sURL = window.document.URL.toString();  
    if (sURL.indexOf("?") > 0)
    {
       var arrParams = sURL.split("?");         
       var arrURLParams = arrParams[1].split("&");      
       var arrParamNames = new Array(arrURLParams.length);
       var arrParamValues = new Array(arrURLParams.length);     
       var i = 0;
       for (i=0;i<arrURLParams.length;i++)
       {
        var sParam =  arrURLParams[i].split("=");
        arrParamNames[i] = sParam[0];
        if (sParam[1] != "")
            arrParamValues[i] = unescape(sParam[1]);
        else
            arrParamValues[i] = "No Value";
       }

       for (i=0;i<arrURLParams.length;i++)
       {
                if(arrParamNames[i] == paramName){
            //alert("Param:"+arrParamValues[i]);
                return arrParamValues[i];
             }
       }
       return "No Parameters Found";
    }

}

-1

Ho creato una semplice funzione per ottenere il parametro URL in JavaScript da un URL come questo:

.....58e/web/viewer.html?page=*17*&getinfo=33


function buildLinkb(param) {
    var val = document.URL;
    var url = val.substr(val.indexOf(param))  
    var n=parseInt(url.replace(param+"=",""));
    alert(n+1); 
}
buildLinkb("page");

PRODUZIONE: 18


2
Fai attenzione quando pubblichi copia e incolla le risposte testuali / testuali a più domande, queste tendono ad essere contrassegnate come "spam" dalla community. Se lo stai facendo, di solito significa che le domande sono duplicate, quindi segnalale come tali: stackoverflow.com/a/11808489/419
Kev

-1

Nel caso abbiate l'url come localhost / index.xsp? A = 1 # qualcosa e dovete ottenere il parametro non l'hash.

var vars = [], hash, anchor;
var q = document.URL.split('?')[1];
if(q != undefined){
    q = q.split('&');
    for(var i = 0; i < q.length; i++){
        hash = q[i].split('=');
        anchor = hash[1].split('#');
        vars.push(anchor[0]);
        vars[hash[0]] = anchor[0];
    }
}

-1

Leggera modifica alla risposta di @pauloppenheim, in quanto non gestirà correttamente i nomi dei parametri che possono far parte di altri nomi dei parametri.

Ad esempio: se si dispone dei parametri "appenv" e "env", la ripetizione del valore per "env" può raccogliere il valore "appenv".

fix:

var urlParamVal = function (name) {
    var result = RegExp("(&|\\?)" + name + "=(.+?)(&|$)").exec(location.search);
    return result ? decodeURIComponent(result[2]) : "";
};

-2

Questo può aiutare.

<script type="text/javascript">
    $(document).ready(function(){
        alert(getParameterByName("third"));
    });
    function getParameterByName(name){
        var url     = document.URL,
            count   = url.indexOf(name);
            sub     = url.substring(count);
            amper   = sub.indexOf("&"); 

        if(amper == "-1"){
            var param = sub.split("=");
            return param[1];
        }else{
            var param = sub.substr(0,amper).split("=");
            return param[1];
        }

    }
</script>

1
Questo codice non è stato testato bene. Indovina cosa succede con la query?twothrids=text
Lyth,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.