如何从location.search获取特定的参数?
如果我有一个URL如
http://localhost/search.php?year=2008
我将如何编写一个JavaScript函数来获取variables年,并查看它是否包含任何内容?
我知道这可以用location.search
完成,但我不知道如何抓取参数。
我最喜欢的方法是获取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"]);
干杯亚历克斯
一个非正则expression式的方法,你可以简单地分割字符'&'和迭代通过键/值对:
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; }
以下使用正则expression式和search仅在URL的查询string部分。
最重要的是,这个方法支持普通和数组参数,如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
我花了一段时间才find这个问题的答案。 大多数人似乎build议正则expression式的解决scheme。 我非常喜欢使用经过尝试和testing的代码,而不是我或其他人在飞行中想到的正则expression式。
我使用这里提供的parseUri库: http ://stevenlevithan.com/demo/parseuri/js/
它可以让你做到你所要求的:
var uri = 'http://localhost/search.php?year=2008'; var year = uri.queryKey['year']; // 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"
最简单的方法是有
if (document.location.search.indexOf('yourtext=') >= 0) { // your code } else { // what happens? }
指数()
indexOf(text)
函数返回
- 当函数中传递的文本不在您正在查找的任何variables或string中时(在本例中为
document.location.search
则为0以下的整数 。 - 当函数中传递的文本位于您正在查找的任何variables或string中时, 整数等于0或更高 – 在本例中为
document.location.search
。
我希望这是有用的, @ gumbo
你可以使用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');
我使用了Alex的变体 – 但需要将param出现多次转换为数组。 似乎有很多select。 我不想依赖另一个图书馆来做这件简单的事情。 我想这里发布的其他select可能会更好一些 – 我适应亚历克斯的,因为直线性。
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; };
我玩了一下这个问题,为此我用了这个:
function getJsonFromUrl() { return Object.assign(...location.search.substr(1).split("&").map(sliceProperty)); }
-
Object.assign
将对象列表转换为一个对象 - Spread运算符
...
将数组转换为列表 -
location.search.substr(1).split("&")
将所有参数作为属性数组(foo=bar
) -
map
遍历每个属性并将它们拆分成一个数组(可以调用splitProperty
或sliceProperty
)。
splitProperty
:
function splitProperty(pair) { [key, value] = pair.split("=") return { [key]: decodeURIComponent(value) } }
- 按
=
分割 - 将数组parsing为两个元素的数组
- 用dynamic属性语法返回一个新的对象
sliceProperty
:
function sliceProperty(pair) { const position = pair.indexOf("="), key = pair.slice(0, position), value = pair.slice(position + 1, pair.length); return { [key]: decodeURIComponent(value) } }
- 设置
=
,键和值的位置 - 用dynamic属性语法返回一个新的对象
我认为splitProperty
更漂亮,但sliceProperty
更快。 运行JsPerf获取更多信息。
这个问题很老,而且JavaScript已经发展了。 你现在可以这样做:
let params = {} document.location.search.substr(1).split('&').forEach(pair => { [key, value] = pair.split('=') params[key] = value })
你得到params.year
包含2008
。 你也可以在你的params
对象中得到其他的查询参数。