如果我有一个网址,例如
http://localhost/search.php?year=2008
我如何编写JavaScript函数来获取变量 year 并查看它是否包含任何内容?
我知道可以使用location.search
完成,但我无法弄清楚它是如何抓取参数的。
答案 0 :(得分:54)
我最喜欢获取URL参数的方法是这种方法:
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"]);
答案 1 :(得分:30)
非正则表达式方法,您可以简单地按字符“&”拆分并遍历键/值对:
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;
}
答案 2 :(得分:24)
您可以使用window.URL
类:
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');
答案 3 :(得分:10)
这个问题已经陈旧,JavaScript已经发生了变化。 你现在可以这样做:
const params = {}
document.location.search.substr(1).split('&').forEach(pair => {
[key, value] = pair.split('=')
params[key] = value
})
您获得的params.year
包含2008
。
您还可以在params
对象中获得其他查询参数。
修改:更简洁/更简洁的方法:
const params = new Map(location.search.slice(1).split('&').map(kv => kv.split('=')))
然后,您可以测试year
参数是否存在:
params.has('year') // true
或者使用以下方法检索它:
params.get('year') // 2008
答案 4 :(得分:7)
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"
答案 5 :(得分:7)
以下使用正则表达式并仅搜索URL的查询字符串部分。
最重要的是,此方法支持普通和数组参数,如
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"));
<强>输出:强>
zip
!!=
7890
false
答案 6 :(得分:6)
我花了一段时间才找到这个问题的答案。大多数人似乎都在建议使用正则表达式解决方案。我非常喜欢使用经过测试和测试的代码,而不是我或其他人在运行时想到的正则表达式。
我使用这里提供的parseUri库: http://stevenlevithan.com/demo/parseuri/js/
它可以让你完全按照你的要求去做:
var uri = 'http://localhost/search.php?year=2008';
var year = uri.queryKey['year'];
// year = '2008'
答案 7 :(得分:5)
最简单的方法是
if (document.location.search.indexOf('yourtext=') >= 0) {
// your code
} else {
// what happens?
}
indexOf(text)
函数返回
document.location.search
。document.location.search
。我希望这很有用, @gumbo
答案 8 :(得分:1)
我使用了Alex的变体 - 但需要将多次出现的param转换为数组。似乎有很多选择。我不想依赖另一个库来做这么简单的事情。我想这里发布的其他选项之一可能会更好 - 我因为直截了当而改编了亚历克斯。
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;
};
答案 9 :(得分:1)
我对这个问题玩了一下,为此我用了这个:
function getJsonFromUrl() {
return Object.assign(...location.search.substr(1).split("&").map(sliceProperty));
}
Object.assign
将对象列表转换为一个对象...
将数组转换为列表location.search.substr(1).split("&")
将所有参数作为属性数组(foo=bar
)map
遍历每个属性并将其拆分为数组(调用splitProperty
或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) }
}
=
,键和值我认为splitProperty
更漂亮但sliceProperty
更快。有关详细信息,请运行JsPerf。
答案 10 :(得分:1)
从location.search获取参数的一行:
const params = new Map(this.props.location.search.slice(1).split('&').map(param => param.split('=')))
然后,简单地:
if(params.get("year")){
//year exists. do something...
} else {
//year doesn't exist. do something else...
}
答案 11 :(得分:0)
使用此紧凑的单行来获取查询字符串的对象:
var query = Object.assign.apply(0,location.search.slice(1).split('&').map(a=>({[a.split('=')[0]]:a.split('=')[1]})));
现在只需使用query['key']
获取所述密钥的值。
答案 12 :(得分:0)
这就是我想要做的:
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;
},
{}
);
当然,您可以使用现代语法或将所有内容写成一行来使其更紧凑...
我留给你。
答案 13 :(得分:-1)
ES6答案:
const parseQueryString = (path = window.location.search) =>
path.slice(1).split('&').reduce((car, cur) => {
const [key, value] = cur.split('=')
return { ...car, [key]: value }
}, {})
例如:
parseQueryString('?foo=bar&foobar=baz')
// => {foo: "bar", foobar: "baz"}