使用jQuery从URL获取查询字符串

322

我有以下网址:

http://www.mysite.co.uk/?location=mylocation1
我需要将URL中location的值存储到变量中,并在jQuery代码中使用它。
var thequerystring = "getthequerystringhere"

$('html,body').animate({scrollTop: $("div#" + thequerystring).offset().top}, 500);

我怎样才能使用 JavaScript 或 jQuery 获取那个值?


可能会对某些人有所帮助。https://gist.github.com/helpse/4d4842c69782b9f94a72 - helpse
4
var locationValue = (new URL(location.href)).searchParams.get('location') - soccer7
5个回答

599

来源:http://jquery-howto.blogspot.com/2009/09/get-url-parameters-values-with-jquery.html

这就是你需要的 :)

以下代码将返回一个包含URL参数的JavaScript对象:

// Read a page's GET URL variables and return them as an associative array.
function getUrlVars()
{
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)
    {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}

例如,如果您有以下URL:

http://www.example.com/?me=myValue&name2=SomeOtherValue

这段代码将返回:

{
    "me"    : "myValue",
    "name2" : "SomeOtherValue"
}

您可以这样做:

var me = getUrlVars()["me"];
var name2 = getUrlVars()["name2"];

13
请注意,该解决方案不会解码参数值,似乎也不会明确处理URL中的 # 值?我建议使用 https://dev59.com/nHNA5IYBdhLWcg3wmfAa#901144,就像 @Steve 所做的那样。 - Rory
4
糟糕的答案。不能处理片段。 - Morg.
5
@Rory,是的:这个:"http://stackoverflow.com?foo=bar#topic1" 将会给你 {"foo" : "bar#topic"}。这就是为什么这位可怜的家伙请求一个知名的库的解决方案,很可能是希望找到一个已经过测试并覆盖所有情况的解决方案(我的意思是他希望找到这样的解决方案,而不是说jQuery一定提供这样的解决方案)。 - kghastie
4
你应该修改你的代码,使用 window.location.search 而不是截取 window.location.href。 - Agi Hammerthief
2
此外,它返回一个对象 - JavaScript没有关联数组。在JavaScript中,开放大括号应该与表达式放在同一行。</superpickycomment> - danwellman
显示剩余8条评论

183

要从当前URL中检索包含字符?的完整查询字符串,您可以使用

location.search

https://developer.mozilla.org/en-US/docs/DOM/window.location

例子:

// URL = https://example.com?a=a%20a&b=b123
console.log(location.search); // Prints "?a=a%20a&b=b123" 

关于获取特定的查询字符串参数,虽然存在像URLSearchParamsURL这样的类,但它们目前不受Internet Explorer支持,因此应该避免使用。相反,您可以尝试如下方法:

/**
 * Accepts either a URL or querystring and returns an object associating 
 * each querystring parameter to its value. 
 *
 * Returns an empty object if no querystring parameters found.
 */
function getUrlParams(urlOrQueryString) {
  if ((i = urlOrQueryString.indexOf('?')) >= 0) {
    const queryString = urlOrQueryString.substring(i+1);
    if (queryString) {
      return _mapUrlParams(queryString);
    } 
  }
  
  return {};
}

/**
 * Helper function for `getUrlParams()`
 * Builds the querystring parameter to value object map.
 *
 * @param queryString {string} - The full querystring, without the leading '?'.
 */
function _mapUrlParams(queryString) {
  return queryString    
    .split('&') 
    .map(function(keyValueString) { return keyValueString.split('=') })
    .reduce(function(urlParams, [key, value]) {
      if (Number.isInteger(parseInt(value)) && parseInt(value) == value) {
        urlParams[key] = parseInt(value);
      } else {
        urlParams[key] = decodeURI(value);
      }
      return urlParams;
    }, {});
}

您可以这样使用上述内容:

// Using location.search
let urlParams = getUrlParams(location.search); // Assume location.search = "?a=1&b=2b2"
console.log(urlParams); // Prints { "a": 1, "b": "2b2" }

// Using a URL string
const url = 'https://example.com?a=A%20A&b=1';
urlParams = getUrlParams(url);
console.log(urlParams); // Prints { "a": "A A", "b": 1 }

// To check if a parameter exists, simply do:
if (urlParams.hasOwnProperty('parameterName')) { 
  console.log(urlParams.parameterName);
}


8
这个可以携带吗? - Cheezmeister
3
这并不会从URL字符串中返回搜索字符串。它只返回当前页面地址栏中的搜索字符串值。 - Dwight
@Cheezmeister:location.search 在 Chrome、Firefox 和 IE10+ 中可用。在 IE9 及更低版本中也可能可用,但我手头没有这样的浏览器。Dwight:window.location.search 返回查询字符串。在控制台上尝试在 此页面 上使用它,你会看到 ?a=b&c=d - Dan Dascalescu
2
在提取location.search之后仍然有一些工作要做。尽管如此,这是让您完成一半的最快方法。您需要去掉“?”并在“&”处进行拆分,然后在“=”上拆分每个结果。 - Artif3x
1
使用URLSearchParams。更多详细信息请参见:https://developer.mozilla.org/zh-CN/docs/Web/API/URLSearchParams例如,URL有两个参数 ?id=123&category=abcvar urlParams = new URLSearchParams(location.search) var id = urlParams.get('id'); var cat = urlParams.get('category'); - Syed Nasir Abbas
显示剩余3条评论

36

通过一些 jQuery 和纯 JavaScript,可以很容易地实现这一点,只需在 Chrome 或 Firefox 中查看控制台即可查看输出结果...

  var queries = {};
  $.each(document.location.search.substr(1).split('&'),function(c,q){
    var i = q.split('=');
    queries[i[0].toString()] = i[1].toString();
  });
  console.log(queries);

2
你可能想在中途删除 + 和 decodeURIComponent... 并使用 window.location.search。 - mplungjan
1
方便!请注意,如果您想处理空/ null 查询字符串元素,则需要添加一个“if(i [0] .length> 0)...”块... - ericpeters0n
3
还有,真不敢相信这需要五行JavaScript代码才能完成。现在是什么年代了? - ericpeters0n
你不应该在“=”上进行分割,因为在任何键/值对的值中都有第二个等号符号技术上是可以的。-- 每个键/值对只应将第一个等号符号视为分隔符。(此外,等号符号并非必需;可以有一个没有值的键。) - BrainSlugs83
此解决方案未考虑查询中的数组,例如 filters[class]=Gym。 - undefinedman
这正是我所需要的,谢谢。 - William Howley

28

看一下这个Stack Overflow答案

 function getParameterByName(name, url) {
     if (!url) url = window.location.href;
     name = name.replace(/[\[\]]/g, "\\$&");
     var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
         results = regex.exec(url);
     if (!results) return null;
     if (!results[2]) return '';
     return decodeURIComponent(results[2].replace(/\+/g, " "));
 }
您可以使用该方法来执行动画: 即:
var thequerystring = getParameterByName("location");
$('html,body').animate({scrollTop: $("div#" + thequerystring).offset().top}, 500);

0

我们是这样做的...

String.prototype.getValueByKey = function (k) {
    var p = new RegExp('\\b' + k + '\\b', 'gi');
    return this.search(p) != -1 ? decodeURIComponent(this.substr(this.search(p) + k.length + 1).substr(0, this.substr(this.search(p) + k.length + 1).search(/(&|;|$)/))) : "";
};

7
我认为人们不会将字符串对象与其中的查询字符串值联系在一起。 - Phil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接