JavaScript查询字符串

cor*_*ore 105 javascript query-string

是否有任何JavaScript库使查询字符串中的字典成为ASP.NET样式?

可以使用的东西像:

var query = window.location.querystring["query"]?
Run Code Online (Sandbox Code Playgroud)

"查询字符串"叫别的东西外面.NET的境界?为什么没有location.search分成键/值集合

编辑:我已经编写了自己的函数,但是任何主要的JavaScript库都可以这样做吗?

CMS*_*CMS 230

您可以从location.search属性中提取键/值对,此属性是否包含以下URL的部分?符号,包括?符号.

function getQueryString() {
  var result = {}, queryString = location.search.slice(1),
      re = /([^&=]+)=([^&]*)/g, m;

  while (m = re.exec(queryString)) {
    result[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
  }

  return result;
}

// ...
var myParam = getQueryString()["myParam"];
Run Code Online (Sandbox Code Playgroud)

  • 这不是一场胜利.如果键的值中包含'='字符会怎样?例如dork.com/?equation=10=2.你可能会认为它应该是URL编码但它肯定不是必须的.我曾经错误地写过这样一个天真的函数.此功能占用的边缘情况不止一个. (11认同)
  • @James,忘记提到几个月前我已修改了这个功能,现在它正确地可以处理你的例子`dork.com/?equation = 10 = 2` ... (6认同)
  • @CMS这不处理查询字符串中的数组的可能性,如此表示`?val = foo&val = bar&val = baz`你会如何容纳这个? (2认同)
  • @RussBradberry你真的不能有'val = foo&val = bar&val = baz`; 它必须是`val [] = foo&val [] = bar&val [] = baz` (2认同)

Qwe*_*rty 22

tl;使用vanilla javascript在单个(ish)代码行上解决方案

var queryDict = {}
location.search.substr(1).split("&").forEach(function(item) {
    queryDict[item.split("=")[0]] = item.split("=")[1]
})
Run Code Online (Sandbox Code Playgroud)

对于查询字符串,?a=1&b=2&c=3&d&e它返回:

> queryDict
a: "1"
b: "2"
c: "3"
d: undefined
e: undefined
Run Code Online (Sandbox Code Playgroud)

多值键编码字符

请参阅如何在JavaScript中获取查询字符串值的原始答案

"?a=1&b=2&c=3&d&e&a=5&a=t%20e%20x%20t&e=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dståle%26car%3Dsaab"
> queryDict
a: ["1", "5", "t e x t"]
b: ["2"]
c: ["3"]
d: [undefined]
e: [undefined, "http://w3schools.com/my test.asp?name=ståle&car=saab"]
Run Code Online (Sandbox Code Playgroud)

  • 这不是一行 - 它的几行格式很糟糕! (8认同)
  • 该死,我不知道该说什么...你抓住了我。在这里,有一些多行解决方案: ` var queryDict = {}; location.search.substr(1).split("&").forEach( function(item) { queryDict[item.split("=")[0]] = item.split("=")[1]; } );` (2认同)
  • 哈哈,我喜欢它!对不起,我曾经和一个曾经说'我找到了一个x的衬里'的人一起工作,然后只给你看了3行并取出了换行符! (2认同)

Sha*_*531 11

也许http://plugins.jquery.com/query-object/

这是它的分支https://github.com/sousk/jquery.parsequery#readme.

  • 这应该是jquery的原生 (37认同)

d0u*_*gal 8

在找到这篇文章之后,当我自己看时,我认为我应该补充一点,我不认为最高投票的解决方案是最好的.它不处理数组值(例如?a = foo&a = bar - 在这种情况下,我希望得到一个返回['foo','bar']).据我所知,它没有考虑编码值 - 例如十六进制字符编码,其中%20表示空格(例如:?a = Hello%20World)或用于表示空格的加号(例如:?a = Hello + World).

Node.js为查询字符串解析提供了一个非常完整的解决方案.在你自己的项目中取出并使用它是很容易的,因为它相当好的隔离和许可许可.

它的代码可以在这里查看:https://github.com/joyent/node/blob/master/lib/querystring.js

可以在这里看到Node的测试:https: //github.com/joyent/node/blob/master/test/simple/test-querystring.js我建议尝试其中一些与流行的答案,看看它是如何处理他们.

我还参与了一个专门添加此功能的项目.它是Python标准lib查询字符串解析模块的一个端口.我的分叉可以在这里找到:https://github.com/d0ugal/jquery.qeeree


and*_*rsh 5

或者您可以使用库sugar.js.

来自sugarjs.com:

Object.fromQueryString(str,deep = true )

将URL的查询字符串转换为对象.如果deep为false,则转换将仅接受浅参数(即没有具有[]语法的对象或数组),因为这些不是普遍支持的.

Object.fromQueryString('foo=bar&broken=wear') >{"foo":"bar","broken":"wear"}
Object.fromQueryString('foo[]=1&foo[]=2') >{"foo":[1,2]}
Run Code Online (Sandbox Code Playgroud)

例:

var queryString = Object.fromQueryString(location.search);
var foo = queryString.foo;
Run Code Online (Sandbox Code Playgroud)