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.