Javascript 如何从location.search获取特定参数?
如果我有一个URL,比如Javascript 如何从location.search获取特定参数?,javascript,url,Javascript,Url,如果我有一个URL,比如 http://localhost/search.php?year=2008 如何编写JavaScript函数来获取变量year并查看它是否包含任何内容 我知道它可以通过位置来完成。搜索,但我不知道它是如何获取参数的。一种非正则表达式方法,您可以简单地按字符“&”分割,然后遍历键/值对: function gup( name ) { name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); va
http://localhost/search.php?year=2008
如何编写JavaScript函数来获取变量year并查看它是否包含任何内容
我知道它可以通过
位置来完成。搜索,但我不知道它是如何获取参数的。一种非正则表达式方法,您可以简单地按字符“&”分割,然后遍历键/值对:
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"
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;
}
下面使用正则表达式并仅搜索URL的查询字符串部分
最重要的是,此方法支持法线和数组参数,如中所示
http://localhost/?fiz=zip&foo[]=!!=&bar=7890#hashhash
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
我最喜欢的获取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"]);
我花了一段时间才找到这个问题的答案。大多数人似乎都在建议正则表达式解决方案。我非常喜欢使用经过尝试和测试的代码,而不是我或其他人在动态中想到的正则表达式
我使用此处提供的parseUri库:
它允许您完全按照自己的要求执行:
var uri = 'http://localhost/search.php?year=2008';
var year = uri.queryKey['year'];
// year = '2008'
我使用了Alex的变体,但需要将多次出现的参数转换为数组。似乎有很多选择。我不想依靠另一个图书馆来完成这么简单的事情。我想在这里发布的其他选项之一可能会更好——因为直截了当,我改编了亚历克斯的
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;
};
最简单的方法是
if (document.location.search.indexOf('yourtext=') >= 0) {
// your code
} else {
// what happens?
}
indexOf()
indexOf(text)
函数返回
- 当函数中传递的文本不在您要查找的任何变量或字符串中时,小于0的整数——在本例中为
document.location.search
- 当函数中传递的文本位于您要查找的变量或字符串中时,等于0或更高的整数——在本例中为
document.location.search
我希望这是有用的,您可以使用类:
这个问题由来已久,而且在JavaScript中已经有所发展。
您现在可以执行以下操作:
const params = {}
document.location.search.substr(1).split('&').forEach(pair => {
[key, value] = pair.split('=')
params[key] = value
})
您将获得包含2008
的params.year
。
您还可以在params
对象中获得其他查询参数
编辑:一种更短/更简洁的方法:
const params = new Map(location.search.slice(1).split('&').map(kv => kv.split('=')))
然后,您可以测试年份
参数是否存在:
params.has('year') // true
或通过以下方式检索:
params.get('year') // 2008
编辑2020
您可以将URL参数转换为对象:
const params=location.search.slice(1).split('&').reduce((acc,s)=>{
常数[k,v]=s.split('='))
返回Object.assign(acc,{[k]:v})
}, {})
然后可以将其用作常规JS对象:
params.year//2008
我对这个问题做了一些处理,最后我使用了这个:
function getJsonFromUrl() {
return Object.assign(...location.search.substr(1).split("&").map(sliceProperty));
}
对象。分配
将对象列表转换为一个对象
- 扩展运算符
…
将数组转换为列表
location.search.substr(1).split(“&”)
以属性数组的形式获取所有参数(foo=bar
)
map
遍历每个属性并将它们拆分为一个数组(调用splitProperty
或sliceProperty
)
splitProperty
:
function splitProperty(pair) {
[key, value] = pair.split("=")
return { [key]: decodeURIComponent(value) }
}
function sliceProperty(pair) {
const position = pair.indexOf("="),
key = pair.slice(0, position),
value = pair.slice(position + 1, pair.length);
return { [key]: decodeURIComponent(value) }
}
- 按
=
- 将数组解构为两个元素的数组
- 返回具有动态属性语法的新对象
切片属性
:
function splitProperty(pair) {
[key, value] = pair.split("=")
return { [key]: decodeURIComponent(value) }
}
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
更快。运行获取更多信息。一个简单的单线解决方案:
let query=Object.assign.apply(null,location.search.slice(1).split('&').map(entry=>({[entry.split('='))[0]]:entry.split('=')[1]}));
扩展和解释:
//定义变量
让查询;
//获取源查询
query=location.search;
//跳过“?”分隔符
query=query.slice(1);
//按条目分隔符拆分源查询
query=query.split('&');
//用包含查询项的对象替换每个查询项
query=query.map((条目)=>{
//获取查询条目键
让key=entry.split('=')[0];
//获取查询条目值
让value=entry.split('=')[1];
//定义查询对象
让容器={};
//将查询条目添加到对象
容器[键]=值;
//返回查询对象
返回容器;
});
//合并所有查询对象
query=Object.assign.apply(null,query);
从位置抓取参数。用一行搜索:
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...
}
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"}
这就是我喜欢做的:
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;
},
{}
);
当然,您可以使用现代语法或将所有内容写在一行中使其更加紧凑
我把这件事留给你。那里不是一个全局的吗?那么我能做什么呢?(getParameter(“year”)!=“”){var year=getParameter(“year”);document.location.href=page.php?year=$year等。@sarmenhb:你能做:var year=getParameter(“year”);if(year){document.location.href='page.php?year='+year;}@卢卡·马泰斯:不,val不是一个全局变量。它在var searchString,i,val,…中定义为一个本地变量,优雅且易于使用!为什么不将其标记为答案?您应该使用window.location.search
而不是window.location.href
。这将简化您的表达式,而不必检查哈希或查询markersIt在创建一个正则表达式之前,最好先转义“name”中的所有正则表达式元字符。var year=parseUri(window.location.search)。queryKey['year'];是一个更相关的例子。上面的例子不适用于parseUri脚本的1.2版本。字符串yr=location.search.substring(6);
警报(yr);
location.search.split(“year=”)[1]仅在SimpleST中看起来问题已结束,但最新的ans