Come ottenere il parametro URL usando jQuery o JavaScript semplice?


619

Ho visto molti esempi di jQuery in cui la dimensione e il nome del parametro sono sconosciuti.

Il mio URL avrà solo 1 stringa:

http://example.com?sent=yes

Voglio solo rilevare:

  1. Esiste sent?
  2. È uguale a "sì"?




La soluzione migliore che abbia mai visto [qui] [1] [1]: stackoverflow.com/a/901144/3106590
hmfarimani

1
Ora c'è un plugin / libreria per questo, chiamato URI.js: github.com/medialize/URI.js
alexw,

Risposte:


1211

La migliore soluzione qui .

var getUrlParameter = function getUrlParameter(sParam) {
    var sPageURL = window.location.search.substring(1),
        sURLVariables = sPageURL.split('&'),
        sParameterName,
        i;

    for (i = 0; i < sURLVariables.length; i++) {
        sParameterName = sURLVariables[i].split('=');

        if (sParameterName[0] === sParam) {
            return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);
        }
    }
};

E questo è come è possibile utilizzare questa funzione assumendo l'URL è,
http://dummy.com/?technology=jquery&blog=jquerybyexample.

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

8
Grazie! Ma quando ho copiato questo, ho trovato una brutta sorpresa, coinvolgendo uno spazio bianco a larghezza zero (verso la fine). Rendere lo script ha un errore di sintassi invisibile.
Christofer Ohlsson,

11
Ritorna a falseo nullper ricerca vuota
Stefano Caravana,

4
Questa soluzione funziona abbastanza bene per me Ho appena usato var sPageURL = decodeURI (window.location.search.substring (1)); per convertire% 20 caratteri in spazi bianchi e restituisco anche una stringa vuota anziché nulla se il parametro non corrisponde.
Christophe,

18
Ho aggiornato la risposta per includere tutte le modifiche al codice dei commenti sopra questo commento.
Rob Evans,

7
La decodifica dovrebbe essere fatta sul valore del parametro (come suggerisce Iouri). Se la decodifica viene eseguita sull'URL (come nella risposta), non funzionerà correttamente se è presente un valore codificato &o =un parametro.
zakinster,

288

Soluzione dal 2020

Abbiamo: http://example.com?sent=yes

let searchParams = new URLSearchParams(window.location.search)

Non ha inviato esistere ?

searchParams.has('sent') // true

È uguale a "sì"?

let param = searchParams.get('sent')

e poi basta confrontarlo.


16
penso che questo non sia supportato su tutti i browser, quindi perché dovremmo usarlo? riferimento - developer.mozilla.org/en-US/docs/Web/API/URLSearchParams
p_champ

1
@p_champ hai ragione. Ma puoi usare polyfill per URLSearchParams
Optio

2
attualmente non funziona in IE / Edge, quindi fai il rilevamento delle caratteristiche: if ('URLSearchParams' in window) { // Browser supports URLSearchParams} Vedi qui
mfgmicha,

4
Abbastanza buono per me e il mio pubblico previsto. caniuse.com/#feat=urlsearchparams
jontsai

4
@p_champ Edge ha ottenuto supporto in v17 (aprile 2018). Lascia morire IE.
Ryan DuVal

198

Snippet 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;
    }
    return decodeURI(results[1]) || 0;
}

example.com?param1=name¶m2=&id=6

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

parametri di esempio con spazi

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



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

12
Nota: è necessario decodificare nel caso in cui ci siano caratteri speciali come parametro o Umlaute ecc. Quindi, invece di return results[1] || 0;esso dovrebbe esserereturn decodeURI(results[1]) || 0;
Kai Noack,

Solo curioso, perché ha bisogno della || 0parte in quanto esiste già un controllo per il risultato, non restituirebbe sempre l'array delle partite?
AirWick219,

@ AirWick219 un'adeguata sicurezza. sebbene ridondante, non fa mai male essere cauti
zanderwar,

2
Ecco, molto probabilmente, la fonte originale: sitepoint.com/url-parameters-jquery ma a questa risposta sono state aggiunte alcune nuove idee
bgmCoder

1
Non sono sicuro che valga la pena usare jQuery per questo.
Quentin, 2

88

Lo attengo sempre come una riga. Ora params ha i var:

params={};location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi,function(s,k,v){params[k]=v})

multi-foderato:

var params={};
window.location.search
  .replace(/[?&]+([^=&]+)=([^&]*)/gi, function(str,key,value) {
    params[key] = value;
  }
);

come una funzione

function getSearchParams(k){
 var p={};
 location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi,function(s,k,v){p[k]=v})
 return k?p[k]:p;
}

che potresti usare come:

getSearchParams()  //returns {key1:val1, key2:val2}

o

getSearchParams("key1")  //returns val1

Brutto hack che modifica la stringa di ricerca ... ma non sono necessari moduli esterni o jquery. Mi piace.
Bryce,

4
@Bryce In realtà non modifica la stringa di ricerca. il .replace restituisce effettivamente una nuova stringa e quelle stringhe restituite vengono elaborate nell'oggetto params.
AwokeKnowing

Bello, breve e, contrariamente alla soluzione accettata, non è necessario ripetere l'URL ogni volta che è necessario un valore. Potrebbe essere leggermente migliorato con la replace(/[?&;]+([^=]+)=([^&;]*)/giriconciliazione ";" carattere anche come separatore.
Le Droid,

one-liner chiaro e indolore, migliore della risposta accettata per me, niente libs extra.
Sam,

Questo è ciò che si userebbe se si utilizzassero gli hash invece del delimitatore di query GET (punto interrogativo): var params={};window.location.hash.replace(/[#&]+([^=&]+)=([^&]*)/gi,function(str,key,value){params[key] = value;}); questo è utile per cose come AJAX in cui l'hash nella finestra viene aggiornato con richieste ajax ma uno anche l'utente per andare a un uri contenente un hash.
Tommie,

48

Ancora un'altra funzione alternativa ...

function param(name) {
    return (location.search.split(name + '=')[1] || '').split('&')[0];
}

il nome deve essere una stringa. Ha funzionato come un incanto ~
mintedsky

2
Questo è il mio preferito. +1 Nota però che questo è un tipo di ricerca "termina con". Ad esempio, se si passa a "Telefono" per il nome e c'è anche un campo chiamato "HomePhone", questo potrebbe restituire il valore di quello sbagliato se viene prima nell'URL.
Efreed

2
Questo è sbagliato! Ad esempio param('t') == param('sent') == 'yes'nell'esempio OP. Ecco una correzione: return (location.search.split(new RegExp('[?&]' + name + '='))[1] || '').split('&')[0]; Si noti inoltre che non è possibile stabilire se il parametro esiste perché si ottiene una stringa vuota per i parametri mancanti.
Oriadam,

Molto semplice ed elegante. Funziona come un sogno. Grazie.
Anjana Silva,

// (per forzare l'esistenza della chiave completa anziché solo l'ultima parte della chiave)return (location.search.split('?' + name + '=')[1] || location.search.split('&' + name + '=')[1] || '').split('&')[0];
Aaron

45

Potrebbe essere troppo tardi. Ma questo metodo è molto facile e semplice

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.url.js"></script>

<!-- URL:  www.example.com/correct/?message=done&year=1990 -->

<script type="text/javascript">
$(function(){
    $.url.attr('protocol')  // --> Protocol: "http"
    $.url.attr('path')      // --> host: "www.example.com"
    $.url.attr('query')         // --> path: "/correct/"
    $.url.attr('message')       // --> query: "done"
    $.url.attr('year')      // --> query: "1990"
});

AGGIORNAMENTO
Richiede il plug-in url: plugins.jquery.com/url
Grazie -Ripounet


2
Chi decide su questo dovrebbe verificare prima il repository. L'utilizzo è cambiato. $ .url.attr ('message') diventa $ .url ("query") e fornisce solo la query completa! Per ottenere un solo parametro ho dovuto: $ .url ("query"). Split ("=") [1] url github link
pseudozach

34

Oppure puoi usare questa piccola funzione ordinata, perché perché soluzioni troppo complicate?

function getQueryParam(param, defaultValue = undefined) {
    location.search.substr(1)
        .split("&")
        .some(function(item) { // returns first occurence and stops
            return item.split("=")[0] == param && (defaultValue = item.split("=")[1], true)
        })
    return defaultValue
}

che sembra ancora migliore se semplificato e integrato:

tl; dr soluzione a una riga

var queryDict = {};
location.search.substr(1).split("&").forEach(function(item) {queryDict[item.split("=")[0]] = item.split("=")[1]})
risultato:
queryDict ['sent'] // undefined o 'value'

E se avessi caratteri codificati o chiavi multivalore ?

È meglio vedere questa risposta: come posso ottenere i valori della stringa di query in JavaScript?

Sneak Peak

"?a=1&b=2&c=3&d&e&a=5&a=t%20e%20x%20t&e=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dståle%26car%3Dsaab"
> queryDict
a: ["1", "5", "t e x t"]
b: ["2"]
c: ["3"]
d: [undefined]
e: [undefined, "http://w3schools.com/my test.asp?name=ståle&car=saab"]

> queryDict["a"][1] // "5"
> queryDict.a[1] // "5"

3
la suddivisione delle stringhe è probabilmente più veloce di regex. Non che questo sia un fattore considerato che l'URL verrebbe analizzato una sola volta.
Patrick

Questa è la soluzione (la prima) che ha funzionato perfettamente per me su tutti i browser - grazie!
NickyTheWrench,

1
@NickyTheWrench Ottimo per sentirlo, grazie! Ad ogni modo, tieni presente che questa è una soluzione molto semplice, se ricevi complicati parametri URL che contengono caratteri speciali, controlla meglio il link fornito.
Qwerty,

@Qwerty yup - il mio caso d'uso è molto semplice in cui il parametro è sempre lo stesso, ecc. (Praticamente esattamente quello che l'OP ha richiesto) Grazie ancora!
NickyTheWrench l'

1
@BernardVanderBeken Interessante, l'ho risolto, comunque, è una soluzione piuttosto stupida, quella in fondo che supporta array e caratteri codificati è molto meglio.
Qwerty,

33

Utilizzando URLSearchParams:

var params = new window.URLSearchParams(window.location.search);
console.log(params.get('name'));

Fai attenzione alla compatibilità (per lo più va bene, ma IE e Edge, potrebbero essere storie diverse, controlla questo per riferimento compatibile: https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams )


Non la maggior parte dei browser può usarlo.
saf21

URLSearchParams sostituisce il carattere speciale "+" con uno spazio. Quindi, se il tuo parametro url contiene un "+", verrà sostituito.
Growler,

11

Questo è semplice e ha funzionato per me

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

quindi se il tuo URL è http://www.yoursite.com?city=4

prova questo

console.log($.urlParam('city'));

10

Forse potresti dare un'occhiata al dentista JS ? (disclaimer: ho scritto il codice)

codice:

document.URL == "http://helloworld.com/quotes?id=1337&author=kelvin&message=hello"
var currentURL = document.URL;
var params = currentURL.extract();
console.log(params.id); // 1337
console.log(params.author) // "kelvin"
console.log(params.message) // "hello"

con Dentist JS, puoi praticamente chiamare la funzione extract () su tutte le stringhe (es. document.URL.extract ()) e otterrai una HashMap di tutti i parametri trovati. È anche personalizzabile per gestire i delimitatori e tutto il resto.

Versione ridotta <1kb


5

Spero che questo possa aiutare.

 <script type="text/javascript">
   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;
   }

    $(window).load(function() {
      var param = getParameters();
      if (typeof param.sent !== "undefined") {
        // Do something.
      }
    });
</script>

5

function GetRequestParam(param)
{
	var res = null;
	try{
		var qs = decodeURIComponent(window.location.search.substring(1));//get everything after then '?' in URI
		var ar = qs.split('&');
		$.each(ar, function(a, b){
			var kv = b.split('=');
			if(param === kv[0]){
				res = kv[1];
				return false;//break loop
			}
		});
	}catch(e){}
	return res;
}



3

C'è questa grande biblioteca: https://github.com/allmarkedup/purl

che ti permette di fare semplicemente

url = 'http://example.com?sent=yes';
sent = $.url(url).param('sent');
if (typeof sent != 'undefined') { // sent exists
   if (sent == 'yes') { // sent is equal to yes
     // ...
   }
}

L'esempio presuppone che tu stia utilizzando jQuery. Potresti anche usarlo come semplice javascript, la sintassi sarebbe quindi leggermente diversa.


1
Questa libreria non è più gestita, tuttavia la utilizzo ed è eccezionale. Assicurati di utilizzare param non attr per ottenere quei parametri della stringa di query, come l'autore ha incluso nel loro esempio.
Azione Dan

3

Questo potrebbe essere eccessivo, ma v'è una biblioteca piuttosto popolare ora disponibile per URI parsing, chiamati URI.js .

Esempio

var uri = "http://example.org/foo.html?technology=jquery&technology=css&blog=stackoverflow";
var components = URI.parse(uri);
var query = URI.parseQuery(components['query']);
document.getElementById("result").innerHTML = "URI = " + uri;
document.getElementById("result").innerHTML += "<br>technology = " + query['technology'];

// If you look in your console, you will see that this library generates a JS array for multi-valued queries!
console.log(query['technology']);
console.log(query['blog']);
<script src="https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.17.0/URI.min.js"></script>

<span id="result"></span>


3

Così semplice che puoi usare qualsiasi URL e ottenere valore

function getParameterByName(name, url) {
    if (!url) url = window.location.href;
    name = name.replace(/[\[\]]/g, "\\$&");
    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
    results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, " "));
}

Esempio di utilizzo

// query string: ?first=value1&second=&value2
var foo = getParameterByName('first'); // "value1"
var bar = getParameterByName('second'); // "value2" 

Nota: se un parametro è presente più volte (? First = value1 & second = value2), otterrai il primo valore (value1) e il secondo valore come (value2).


2

Questo ti darà un bell'oggetto con cui lavorare

    function queryParameters () {
        var result = {};

        var params = window.location.search.split(/\?|\&/);

        params.forEach( function(it) {
            if (it) {
                var param = it.split("=");
                result[param[0]] = param[1];
            }
        });

        return result;
    }

E poi;

    if (queryParameters().sent === 'yes') { .....

diviso (/ \? | \ & /) questo significa
Selva Ganapathi,

2

Questo si basa sulla risposta di Gazoris , ma l'URL decodifica i parametri in modo che possano essere utilizzati quando contengono dati diversi da numeri e lettere:

function urlParam(name){
    var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
    // Need to decode the URL parameters, including putting in a fix for the plus sign
    // https://stackoverflow.com/a/24417399
    return results ? decodeURIComponent(results[1].replace(/\+/g, '%20')) : null;
}

2

C'è un altro esempio con l'utilizzo della libreria URI.js.

L'esempio risponde alle domande esattamente come richiesto.

var url = 'http://example.com?sent=yes';
var urlParams = new URI(url).search(true);
// 1. Does sent exist?
var sendExists = urlParams.sent !== undefined;
// 2. Is it equal to "yes"?
var sendIsEqualtToYes = urlParams.sent == 'yes';

// output results in readable form
// not required for production
if (sendExists) {
  console.log('Url has "sent" param, its value is "' + urlParams.sent + '"');
  if (urlParams.sent == 'yes') {
    console.log('"Sent" param is equal to "yes"');
  } else {
    console.log('"Sent" param is not equal to "yes"');
  }
} else {
  console.log('Url hasn\'t "sent" param');
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/URI.js/1.18.2/URI.min.js"></script>


2
http://example.com?sent=yes

La migliore soluzione qui .

function getUrlParameter(name) {
    name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
    var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
    var results = regex.exec(location.href);
    return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, '    '));
};

Con la funzione sopra, puoi ottenere singoli valori di parametro:

getUrlParameter('sent');

Risposta perfetta!
Srijani Ghosh

1

Versione Coffeescript della risposta di Sameer

getUrlParameter = (sParam) ->
  sPageURL = window.location.search.substring(1)
  sURLVariables = sPageURL.split('&')
  i = 0
  while i < sURLVariables.length
    sParameterName = sURLVariables[i].split('=')
    if sParameterName[0] == sParam
      return sParameterName[1]
    i++

1

Un leggero miglioramento della risposta di Sameer, memorizza i parametri della cache in chiusura per evitare di analizzare e scorrere tutti i parametri ogni volta che chiama

var getURLParam = (function() {
    var paramStr = decodeURIComponent(window.location.search).substring(1);
    var paramSegs = paramStr.split('&');
    var params = [];
    for(var i = 0; i < paramSegs.length; i++) {
        var paramSeg = paramSegs[i].split('=');
        params[paramSeg[0]] = paramSeg[1];
    }
    console.log(params);
    return function(key) {
        return params[key];
    }
})();

1

Lo uso e funziona. http://codesheet.org/codesheet/NF246Tzs

function getUrlVars() {
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
    vars[key] = value;
    });
return vars;
}


var first = getUrlVars()["id"];

1

Con JavaScript vaniglia, puoi facilmente prendere i parametri (location.search), ottenere la sottostringa (senza il?) E trasformarla in un array, suddividendolo per '&'.

Mentre si scorre attraverso urlParams, è possibile quindi dividere nuovamente la stringa con '=' e aggiungerla all'oggetto 'params' come oggetto [elmement [0]] = element [1]. Super semplice e di facile accesso.

http://www.website.com/?error=userError&type=handwritten

            var urlParams = location.search.substring(1).split('&'),
                params = {};

            urlParams.forEach(function(el){
                var tmpArr = el.split('=');
                params[tmpArr[0]] = tmpArr[1];
            });


            var error = params['error'];
            var type = params['type'];

1

Che cosa succede se è presente un parametro URL URL come nome file = "p & g.html" & uid = 66

In questo caso la 1a funzione non funzionerà correttamente. Quindi ho modificato il codice

function getUrlParameter(sParam) {
    var sURLVariables = window.location.search.substring(1).split('&'), sParameterName, i;

    for (i = 0; i < sURLVariables.length; i++) {
        sParameterName = sURLVariables[i].split('=');

        if (sParameterName[0] === sParam) {
            return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);
        }
    }
}

1

Devo ammettere che sto aggiungendo la mia risposta a una domanda con risposta eccessiva, ma questo ha i vantaggi di:

- Non dipende da alcuna libreria esterna, incluso jQuery

- Non inquina lo spazio dei nomi delle funzioni globali, estendendo 'String'

- Non creare dati globali e fare elaborazioni non necessarie dopo la corrispondenza trovata

- Gestire i problemi di codifica e accettare (assumendo) un nome di parametro non codificato

- Evitare forloop espliciti

String.prototype.urlParamValue = function() {
    var desiredVal = null;
    var paramName = this.valueOf();
    window.location.search.substring(1).split('&').some(function(currentValue, _, _) {
        var nameVal = currentValue.split('=');
        if ( decodeURIComponent(nameVal[0]) === paramName ) {
            desiredVal = decodeURIComponent(nameVal[1]);
            return true;
        }
        return false;
    });
    return desiredVal;
};

Quindi lo useresti come:

var paramVal = "paramName".urlParamValue() // null if no match

1

Se vuoi trovare un parametro specifico da un URL specifico:

function findParam(url, param){
  var check = "" + param;
  if(url.search(check )>=0){
      return url.substring(url.search(check )).split('&')[0].split('=')[1];
  }
}  

var url = "http://www.yourdomain.com/example?id=1&order_no=114&invoice_no=254";  
alert(findParam(url,"order_no"));

0

Un'altra soluzione che utilizza jQuery e JSON, in modo da poter accedere ai valori dei parametri tramite un oggetto.

var loc = window.location.href;
var param = {};
if(loc.indexOf('?') > -1)
{
    var params = loc.substr(loc.indexOf('?')+1, loc.length).split("&");

    var stringJson = "{";
    for(var i=0;i<params.length;i++)
    {
        var propVal = params[i].split("=");
        var paramName = propVal[0];
        var value = propVal[1];
        stringJson += "\""+paramName+"\": \""+value+"\"";
        if(i != params.length-1) stringJson += ",";
    }
    stringJson += "}";
    // parse string with jQuery parseJSON
    param = $.parseJSON(stringJson);
}

Supponendo che il tuo URL sia http://example.com/?search=hello+world&language=en&page=3

Dopodiché si tratta solo di utilizzare i parametri in questo modo:

param.language

ritornare

en

L'utilizzo più utile di questo è eseguirlo al caricamento della pagina e utilizzare una variabile globale per utilizzare i parametri ovunque sia necessario.

Se il tuo parametro contiene valori numerici, analizza il valore.

parseInt(param.page)

Se non ci sono parametri paramsarà solo un oggetto vuoto.


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

& è erroneamente codificato come "& amp;" nella risposta sopra, fare riferimento alla risposta corretta stackoverflow.com/a/25359264/73630
Palani

-1

Usa questo

$.urlParam = function(name) {
  var results = new RegExp('[\?&amp;]' + name + '=([^&amp;#]*)').exec(window.location.href);
  return results[1] || 0;
}
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.