Si j'avais une URL telle que
http://localhost/search.php?year=2008
Comment pourrais-je écrire une fonction JavaScript pour récupérer la variable year et voir si elle contient quelque chose?
Je sais que cela peut être fait avec location.search
mais je ne peux pas comprendre comment il saisit les paramètres.
Mon moyen préféré pour obtenir les paramètres d'URL est cette approche:
var parseQueryString = function() {
var str = window.location.search;
var objURL = {};
str.replace(
new RegExp( "([^?=&]+)(=([^&]*))?", "g" ),
function( $0, $1, $2, $3 ){
objURL[ $1 ] = $3;
}
);
return objURL;
};
//Example how to use it:
var params = parseQueryString();
alert(params["foo"]);
Une approche non regex, vous pouvez simplement diviser par le caractère '&' et parcourir la paire clé/valeur:
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 val[1];
}
}
return null;
}
Vous pouvez utiliser window.URL
class:
new URL(location.href).searchParams.get('year')
// Returns 2008 for href = "http://localhost/search.php?year=2008".
// Or in two steps:
const params = new URL(location.href).searchParams;
const year = params.get('year');
Cette question est ancienne et les choses ont évolué en JavaScript . Vous pouvez maintenant le faire:
const params = {}
document.location.search.substr(1).split('&').forEach(pair => {
[key, value] = pair.split('=')
params[key] = value
})
et vous obtenez params.year
contenant 2008
. Vous obtiendrez également d'autres paramètres de requête dans votre objet params
.
Edit : une façon plus courte/plus propre de faire ceci:
const params = new Map(location.search.slice(1).split('&').map(kv => kv.split('=')))
Vous pouvez ensuite tester si le paramètre year
existe avec:
params.has('year') // true
Ou le récupérer avec:
params.get('year') // 2008
function gup( name ) {
name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
var regexS = "[\\?&]"+name+"=([^&#]*)";
var regex = new RegExp( regexS );
var results = regex.exec( window.location.href );
if( results == null )
return "";
else
return results[1];
}
var year = gup("year"); // returns "2008"
Ce qui suit utilise des expressions régulières et recherche uniquement dans la partie chaîne de requête de l'URL.
Plus important encore, cette méthode prend en charge les paramètres normal et tableau comme dans http://localhost/?fiz=Zip&foo[]=!!=&bar=7890#hashhashhash
function getQueryParam(param) {
var result = window.location.search.match(
new RegExp("(\\?|&)" + param + "(\\[\\])?=([^&]*)")
);
return result ? result[3] : false;
}
console.log(getQueryParam("fiz"));
console.log(getQueryParam("foo"));
console.log(getQueryParam("bar"));
console.log(getQueryParam("zxcv"));
Sortie:
Zip
!!=
7890
false
Il m'a fallu un certain temps pour trouver la réponse à cette question. La plupart des gens semblent suggérer des solutions de regex. Je préfère fortement utiliser un code qui a fait ses preuves, par opposition à une regex que moi-même ou quelqu'un d'autre avons imaginé à la volée.
J'utilise la bibliothèque parseUri disponible ici: http://stevenlevithan.com/demo/parseuri/js/
Cela vous permet de faire exactement ce que vous demandez:
var uri = 'http://localhost/search.php?year=2008';
var year = uri.queryKey['year'];
// year = '2008'
Le plus simple est d’avoir
if (document.location.search.indexOf('yourtext=') >= 0) {
// your code
} else {
// what happens?
}
La fonction indexOf(text)
renvoie
document.location.search
.document.location.search
.J'espère que cela a été utile, @gumbo
J'ai un peu joué avec ce problème et à cette fin j'ai utilisé ceci:
function getJsonFromUrl() {
return Object.assign(...location.search.substr(1).split("&").map(sliceProperty));
}
Object.assign
pour transformer une liste d'objets en un seul objet...
pour transformer un tableau en une listelocation.search.substr(1).split("&")
pour obtenir tous les paramètres en tant que tableau de propriétés (foo=bar
)map
parcourez chaque propriété et les divisez en un tableau (appelez splitProperty
ou sliceProperty
).splitProperty
:
function splitProperty(pair) {
[key, value] = pair.split("=")
return { [key]: decodeURIComponent(value) }
}
=
sliceProperty
:
function sliceProperty(pair) {
const position = pair.indexOf("="),
key = pair.slice(0, position),
value = pair.slice(position + 1, pair.length);
return { [key]: decodeURIComponent(value) }
}
=
, clé et valeurJe pense que splitProperty
est plus joli mais sliceProperty
est plus rapide. Exécutez JsPerf pour plus d'informations.
Saisissez les paramètres de location.search avec une seule ligne:
const params = new Map(this.props.location.search.slice(1).split('&').map(param => param.split('=')))
Ensuite, simplement:
if(params.get("year")){
//year exists. do something...
} else {
//year doesn't exist. do something else...
}
J'ai utilisé une variante de Alex - mais je devais convertir le paramètre apparaissant plusieurs fois en tableau. Il semble y avoir beaucoup d'options. Je ne voulais pas compter sur une autre bibliothèque pour quelque chose d'aussi simple. Je suppose que l’une des autres options publiées ici est peut-être meilleure: j’ai adapté celui d’Alex à cause de la franchise.
parseQueryString = function() {
var str = window.location.search;
var objURL = {};
// local isArray - defer to underscore, as we are already using the lib
var isArray = _.isArray
str.replace(
new RegExp( "([^?=&]+)(=([^&]*))?", "g" ),
function( $0, $1, $2, $3 ){
if(objURL[ $1 ] && !isArray(objURL[ $1 ])){
// if there parameter occurs more than once, convert to an array on 2nd
var first = objURL[ $1 ]
objURL[ $1 ] = [first, $3]
} else if(objURL[ $1 ] && isArray(objURL[ $1 ])){
// if there parameter occurs more than once, add to array after 2nd
objURL[ $1 ].Push($3)
}
else
{
// this is the first instance
objURL[ $1 ] = $3;
}
}
);
return objURL;
};
C'est ce que j'aime faire:
window.location.search
.substr(1)
.split('&')
.reduce(
function(accumulator, currentValue) {
var pair = currentValue
.split('=')
.map(function(value) {
return decodeURIComponent(value);
});
accumulator[pair[0]] = pair[1];
return accumulator;
},
{}
);
Bien sûr, vous pouvez le rendre plus compact en utilisant une syntaxe moderne ou en écrivant le tout sur une seule ligne ...
Je vous laisse cela.
Utilisez cette compact one-liner pour obtenir un objet de la chaîne de requête:
var query = Object.assign.apply(0,location.search.slice(1).split('&').map(a=>({[a.split('=')[0]]:a.split('=')[1]})));
Maintenant, utilisez simplement query['key']
pour obtenir la valeur de ladite clé.