如何从location.search获取特定参数?

52 javascript url

如果我有一个URL,如

http://localhost/search.php?year=2008
Run Code Online (Sandbox Code Playgroud)

我如何编写JavaScript函数来获取变量年份并查看它是否包含任何内容?

我知道它可以完成,location.search但我无法弄清楚它如何抓取参数.

Ale*_*lex 57

我最喜欢获取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"]); 
Run Code Online (Sandbox Code Playgroud)

  • 那位老人总是说"当你遇到只能用正则表达式解决的问题时,你实际上有两个问题". (26认同)

ily*_*rov 34

你可以使用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');
Run Code Online (Sandbox Code Playgroud)

  • window.URL是一个方便的,如果只使用最新的Chrome和Firefox (3认同)
  • 这应该是当今公认的答案 (3认同)

CMS*_*CMS 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;
}
Run Code Online (Sandbox Code Playgroud)

  • @Luca Matteis:不,val不是全球性的.它被定义为var searchString中的局部变量,i,val,... (3认同)

vin*_*yll 11

这个问题很古老,JavaScript已经发生了变化.你现在可以这样做:

const params = {}
document.location.search.substr(1).split('&').forEach(pair => {
  [key, value] = pair.split('=')
  params[key] = value
})
Run Code Online (Sandbox Code Playgroud)

而你得到的params.year包含2008.您还可以在params对象中获得其他查询参数.


编辑:更简洁/更简洁的方法:

const params = new Map(location.search.slice(1).split('&').map(kv => kv.split('=')))
Run Code Online (Sandbox Code Playgroud)

然后,您可以测试该year参数是否存在:

params.has('year')  // true
Run Code Online (Sandbox Code Playgroud)

或者检索它:

params.get('year')  // 2008
Run Code Online (Sandbox Code Playgroud)


Jus*_*son 8

以下使用正则表达式并仅搜索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"));
Run Code Online (Sandbox Code Playgroud)

输出:

zip
!!=
7890
false
Run Code Online (Sandbox Code Playgroud)


Luc*_*eis 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"
Run Code Online (Sandbox Code Playgroud)

  • 你应该使用`window.location.search`而不是`window.location.href`.这将简化您的表达式,而不必检查哈希或查询标记 (3认同)

Chr*_*row 6

我花了一段时间才找到这个问题的答案.大多数人似乎都在建议使用正则表达式解决方案.我非常喜欢使用经过试验和测试的代码,而不是我或其他人在运行时想到的正则表达式.

我使用这里提供的parseUri库:http://stevenlevithan.com/demo/parseuri/js/

它可以让你完全按照你的要求去做:

var uri = 'http://localhost/search.php?year=2008';
var year = uri.queryKey['year'];
// year = '2008'
Run Code Online (Sandbox Code Playgroud)

  • var year = parseUri(window.location.search).queryKey ['year']; 是一个更相关的例子.上面的那个不适用于parseUri脚本的1.2版. (3认同)

小智 5

最简单的方法就是拥有

if (document.location.search.indexOf('yourtext=') >= 0) {
    // your code
} else {
    // what happens?
}
Run Code Online (Sandbox Code Playgroud)

指数()

indexOf(text)函数返回

  • 当函数中传递的文本不在您要查找的任何变量或字符串中时,整数低于0 - 在这种情况下document.location.search.
  • 当函数中传递的文本在您要查找的任何变量或字符串中时,整数等于0或更高 - 在这种情况下document.location.search.

我希望这很有用,@ gumbo

  • 这会因查询字符串而失败,例如`?notyourtext=foo` (2认同)