如何从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遍历每个属性并将它们拆分成一个数组(可以调用splitPropertysliceProperty )。

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对象中得到其他的查询参数。