How can I get query string values in JavaScript?
是否有无插件的方式通过jquery(或不通过jquery)检索查询字符串值?
如果是这样,怎么办?如果没有,是否有插件可以这样做?
- 我使用jquery plugin–geturlparam(版本2)中描述的插件geturlparam。
- 我喜欢Dojo的QueryToObject。如果你在节食,这个功能可以很容易地从框架中提取出来。
- 没有regex的普通javascript解决方案:css-tricks.com/snippets/javascript/get-url-variables
- 尽管这个问题的顶级解决方案因其出色的观察到不需要jquery而受到欢迎,但它为每个需要的参数创建新的正则表达式和重新解析查询字符串的方法效率极低。更高效(和通用)的解决方案已经存在很长一段时间了,例如本文转载的:htmlgoodies.com/beyond/javascript/article.php/11877_uuuzwnj;&8203;3/…
- 可能重复的javascript查询字符串
- 我添加了一个使用Vanilla javascript stackoverflow.com/a/21152762/985454的单行解决方案,请务必检查它!
- 约瑟夫,"很好的观察到jquery是不需要的"?当然不需要。jquery所做的一切,都是使用javascript。人们不使用jquery,因为它做了javascript不能做的事情。jquery的意义是方便的。
- 这是我使用的jquery插件,github.com/huochunbeng/jquery-urlparam
更新日期:2018年9月
您可以使用URLSearchParams,它很简单,并且具有良好的浏览器支持。
1 2 | const urlParams = new URLSearchParams(window.location.search); const myParam = urlParams.get('myParam'); |
原件
为此,您不需要jquery。您可以使用一些纯javascript:
1 2 3 4 5 6 7 8 9 | 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, ' ')); } |
用途:
1 2 3 4 5 | // query string: ?foo=lorem&bar=&baz var foo = getParameterByName('foo'); //"lorem" var bar = getParameterByName('bar'); //"" (present with empty value) var baz = getParameterByName('baz'); //"" (present with no value) var qux = getParameterByName('qux'); // null (absent) |
注:如果一个参数出现多次(
这是基于新的URLSearchParams规范的更新,以更简洁地实现相同的结果。请参阅下面题为"urlsearchparams"的答案。
- 在name.replace行中,您有一个replace,它似乎正在转义和]-是正确的还是应该是和 93;"因为]不需要转义?
- 使用jquery data()函数缓存结果以便进行重复访问,而不是每次都重新进行分析,这可能会很好…
- 也许不错,但在这种情况下没有必要这样做,因为那时您将需要处理过时的数据检查等…
- 没有人说它不能用纯JavaScript完成。如果您已经在使用jquery,并且jquery有一个函数来实现这一点,那么使用jquery而不是用一个新的函数来重新设计控制盘是有意义的。
- 该函数如何处理
http://www.mysite.com/index.php?x=x1&x=x2&x=x3 ,字段x 的值不明确。 - @Kyralessa,我的观点是表明您不需要使用框架来实现目标。但是欢迎您重写并生成jquery插件,顺便问一下,为什么不使用dojo或extjs?
- 原始源netlobo.com/url_query_string_javascript.html
- 这也不能处理多值密钥,这也是完全合法的。
- 为什么要使用正则表达式?
- 对于
?mykey=0&m.+key=1 的querystring,调用getParameterByName("m.+key") 将返回0 而不是1 。在构建正则表达式之前,需要转义name 中的正则表达式元字符。您只需使用global标志并使用"\\$&" 作为替换表达式调用一次.replace() 。你应该搜索location.search ,而不是location.href 。超过400票的回答应该解释这些细节。 - 我们借用了这个,但是添加了一个参数来忽略键名的大小写。所以创建regex的行变成了
var regex = new RegExp(regexS, (ignoreCase ?"i" : undefined)); "\\\]" 有什么意义?为什么不只是\]?(stackoverflow不允许我在代码块中写入\)。- 不管什么原因,这段代码在最新的火狐上都不起作用——在IE9和Chrome中都可以正常工作。但是,下面的答案适用于所有3个问题。
- 我们怎么能确定这是正确的呢?我找不到坏的测试用例并不意味着没有。这毕竟是一个安全问题!看在上帝的份上,调用一个测试良好的标准库函数。
- 我认为当一些参数放在符号后面时,这个答案可以扩展到这个案例。我修改了这种情况下的方法-请参阅我的答案stackoverflow.com/a/15988938/1888017
- 您不需要jquery来实现这一点或任何其他目的。你根本不需要它。
- 在使用哈希时,我不能让这个为我工作。我必须检查
history.pushState ,如果没有,使用'?' + location.hash.split('?')[1] 搜索字符串。希望能帮助别人。 - 我在写单元测试,这里面有太多的逻辑算法。我得写一个测试来测试…假设jquery正在工作,那么我可以使用jquery方法来测试查询字符串。如果它不能正常工作,那么jquery错误报告就可以了。就我的两分钱……
- @Bhargavpanchal我认为这是一个糟糕的编辑:你不再正确地逃避你正在搜索的值(代码中的
paramName ——转义被应用于name ,你实际上也没有搜索name :使用location.search 是很难编码的。我要回去了。 - 抱歉,但是当您分解字符串,然后分解它的部分时,它适用于可能出现的所有内容以及更少的代码。
- 这可能有助于您:frontend.citynamaste.com/2013/09/…您可以使用此链接中描述的javascript函数创建querystring并传递参数。
- 例如,由于regexp中的
= ,它不能与?b 一起工作(没有"="),并且在删除它时,它与r 参数匹配?return 。下面是我使用underline.js gist.github.com/dorian/833b37d2c7b168b7e94c的解决方案 - 这个答案有很多问题。我觉得我已经离开StackOverflow,进入了PHP注释手册。
- 作为一个初学者,我真的对这个答案感到困惑。问题是关于jquery,回答者说"不需要jquery,您可以使用普通的JS"。你好?您的意思是我必须放弃jquery脚本调用和其他jquery函数,调用香草团队建议的另一个脚本:
urlsearchparamsFirefox的歌剧36 44 +,+,+ +边缘17,Safari和Chrome支持10.3 49 +茶:urlsearchparams APIP></
- Chrome announcement and details
- 歌剧announcement and details
- 火狐announcement and details
谷歌suggested there is for the stable urlsearchparams polyfill versions of IE。P></
EN is not by W3C标准,但它是生活模式(Web标准。P></
你可以使用它的在线位置,but You need to remove the question(for example,
? 马克与.slice(1) ):P></1let params = new URLSearchParams(location.search);前P></
1let params = (new URL(location)).searchParams;大学课程在线或任何URL:P></
1
2let url = new URL('https://example.com?foo=1&bar=2');
let params = new URLSearchParams(url.search);You can get参数也使用
.searchParams 物业shorthand on the URL对象,这样:P></1
2
3let params = new URL('https://example.com?foo=1&bar=2').searchParams;
params.get('foo'); //"1"
params.get('bar'); //"2"你读过《
get(KEY) /参数集,set(KEY, VALUE) ,append(KEY, VALUE) API。You can also过for (let p of params) {} 的迭代值。P></参考和样品执行审计和测试页are available for。P></
- 这两位投反对票的人可能(像我刚才那样)错过了这样一个事实:你必须使用
.get 而不是. 。 - 你实际上不需要在
.search 上使用slice(1) ,你可以直接使用它。urlsearchparams可以处理前导的? 。 URLSearchParams 不好,因为它不返回URL参数的实际值。- 此
new URL('https://example.com?foo=1&bar=2') 不适用于android urlfile:///android_asset/... 。 - @Melab它仍然很好,因为它提供了一个简单的API,用于在其他答案中进行奇怪的重新生成。但它也让我吃惊的是,默认情况下ID不执行window.location.search,并且无法更新当前包含的URL。
只是另一个建议。该插件允许检索所有的金银线的部分的URL,包括锚,主机,等。 </P >
它可以(或不可以使用jQuery。 </P >
使用的是非常简单的和很酷的: </P >
1
2
3
4var url = $.url('http://allmarkedup.com/folder/dir/index.html?item=value'); // jQuery version
var url = purl('http://allmarkedup.com/folder/dir/index.html?item=value'); // plain JS version
url.attr('protocol'); // returns 'http'
url.attr('path'); // returns '/folder/dir/index.html'但是,作为一部11月11,到2014年,金银是保持自然和作者的recommends使用uri.js代替。在jQuery插件是不同的,它是focuses元素的设计与使用的字符串,就用
URI 直接,有或没有jQuery。类似的代码会查找AS,富勒的文档在这里: </P >1
2
3var url = new URI('http://allmarkedup.com/folder/dir/index.html?item=value'); // plain JS version
url.protocol(); // returns 'http'
url.path(); // returns '/folder/dir/index.html'- 在编写purl时,不再维护purl,以前的维护者建议使用uri.js
页:1(P)A quick,complete solution,which handles multilvalued keys and encued characters.(p)字母名称多线:字母名称(P)What is all this code…"Null-coalescing",short-circuit evaluationES6 Destructuring Assignments,Arrow Functions,Template Strings(p)例如:字母名称(P)(p)Read More…关于Vanilla Javascript Solution(P)对于URL使用EDOCX1的不同部分,0(p)Easest(Dummy)Solution字母名称- Handles empty keys correctly.
- 有着最后价值的多重钥匙
字母名称Multi-Valued Keys(P)简单的凯奇搜索引擎(p)字母名称
- Now returns arrays instead.
- 通过EDOCX1访问值(英文)2
字母名称缩小字符串?(P)使用EDOCX1为第二个或机器人弹射。(p)字母名称例如:字母名称(P)(p)从评论(P)*!不!请注意,EDOCX1英文本5音译为String EDOCX1英文本6The solution lies in a simple usage of EDOCX1 original 7,which ensures that EDOCX1 original 4 is not called on undefined values.(See the"complete solution"at the top.)(p)字母名称(P)如果Querystring is empty(EDOCX1)英文字母9,那么结果是有什么不正确的EDOCX1英文字母10。It is suggested to check the querysting before launching the parsing function like that:(p)字母名称
- 很好。我唯一要改变的是,如果一个键的值不超过一个,那么它就不需要是一个数组。仅当每个键有多个值时才使用数组。
- @Pavelnikolov我认为这会给获取数组和值带来困难。您必须首先检查它,现在只检查长度,因为无论如何,您都将使用循环来检索这些值。同时,这也是这里最简单但功能性强的解决方案。
- @细枝在IE8中不起作用
- @katsh是的,的确,它在>=ie9中工作,但是,您可以通过在脚本开头插入某些代码来教您的javascript处理器
array.forEach() 。请参见polyfill developer.mozilla.org/en-us/docs/web/javascript/reference/… - @katsh也可以将其改写为普通的
for loop ,但解决方案不会如此优雅:) - 为了可读性而展平一点,做成一个函数,然后重新使用split调用:函数parseQueryString()var qd=location.search.substr(1).split("&;").foreach(函数(项)var parts=item.split("=");var k=parts[0];var v=decodeuricomponent(parTS[1]);(QD中的k)?qd[k].推(v):qd[k]=[v,]);返回qd;
- 只是好奇,为什么在创建一个元素的数组时尾随逗号?CC @凯西。
- @丹达斯卡利苏哈哈,接球不错。:p那是我的错,在我用最优雅的形式做了实验后,我把它忘在了那里。
- decodedocumenturi(undefined)返回"undefined"而不是undefined。一个功能性但不太优雅的补丁:
var qd = {}; location.search.substr(1).split("&").forEach( function(item) { var s = item.split("="), k = s[0], v; if(s.length>1) v = decodeURIComponent(s[1]); (k in qd) ? qd[k].push(v) : qd[k] = [v] }) 。 - @循环谢谢!使用
v = v && decodeURIComponent(v) 固定 - @Querty,那不是
v = s && decodeURIComponent(v) 吗?您的版本永远不会执行decodeURIComponent 。 - @奎蒂,哎呀,我是说埃多克斯。
- @等时的,你确定吗?当
v 计算为true 时,即当v有一个值(例如,未定义)时,连接运行。另外,它是qwerty,而不是querty:d(实际上你不是第一个) - @同步之前的版本是
v = item.split("=")[1]; v = v && decodeURIComponent(v); ,现在是var s = item.split("="), v = s[1] && decodeURIComponent(s[1]); ,重点是当split[1] 返回undefined ,然后decodeURIComponent(undefined) 返回字符串"undefined" ,这是错误的。 - 为什么不解码值的"名称"?它很可能有编码字符。
- @Triynko可能,但这没有多大意义。无论如何,变量名都应该使用英文标准字母。但是你当然可以在它们的
decodeURIComponent() 中包装这两个部分。 - 我喜欢你的解决方案。但是,当我在一个没有查询参数的页面上尝试它时,
qd == {'':[undefined]} ,这是不理想的。我的解决方案在运行代码之前检查location.search 是否为非空,因此如果没有参数,字典将为空。
snipplr.com上的roshambo有一个简单的脚本来实现这一点,在get url参数中对jquery进行了改进。使用他的脚本,您还可以轻松地提取出所需的参数。
要点如下:
1
2
3
4
5
6
7
8
9
10$.urlParam = function(name, url) {
if (!url) {
url = window.location.href;
}
var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(url);
if (!results) {
return undefined;
}
return results[1] || undefined;
}然后从查询字符串中获取参数。
所以如果url/query字符串是
xyz.com/index.html?lang=de 。打电话给
var langval = $.urlParam('lang'); ,你就知道了。Uzbekjon也有一篇很棒的博客文章,可以通过jquery获取URL参数和值。
- 使用jquery似乎意味着将函数命名为jquery对象。另外,为什么无效值
0 ?当然,我可以使用严格的平等检查,但不应该是null 吗? - 同意。它的工作方式和普通的javascript变量引用一样(除了返回undefined可能更准确)。
- "name"未正确转义,它只是直接注入regexp。这失败了。正如其他人所说,令人难以置信的是,这些答案正在重塑方向盘,并获得如此多的选票,而这些选票应该在经过良好测试的库中实现。
如果使用jquery,则可以使用库,如jquery bbq:back button&query library。
...jQuery BBQ provides a full
.deparam() method, along with both hash state management, and fragment / query string parse and merge utility methods.编辑:添加deparam示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14var DeparamExample = function() {
var params = $.deparam.querystring();
//nameofparam is the name of a param from url
//code below will get param if ajax refresh with hash
if (typeof params.nameofparam == 'undefined') {
params = jQuery.deparam.fragment(window.location.href);
}
if (typeof params.nameofparam != 'undefined') {
var paramValue = params.nameofparam.toString();
}
};如果你只想使用普通的javascript,你可以使用…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26var getParamValue = (function() {
var params;
var resetParams = function() {
var query = window.location.search;
var regex = /[?&;](.+?)=([^&;]+)/g;
var match;
params = {};
if (query) {
while (match = regex.exec(query)) {
params[match[1]] = decodeURIComponent(match[2]);
}
}
};
window.addEventListener
&& window.addEventListener('popstate', resetParams);
resetParams();
return function(param) {
return params.hasOwnProperty(param) ? params[param] : null;
}
})();?由于新的HTML历史API,特别是
history.pushState() 和history.replaceState() ,URL可能会更改,这将使参数及其值的缓存无效。此版本将在每次更改历史记录时更新其参数的内部缓存。
只使用两splits:P></
1
2
3
4function get(n) {
var half = location.search.split(n + '=')[1];
return half !== undefined ? decodeURIComponent(half.split('&')[0]) : null;
}我在the previous阅读完整的答案和更多。但我认为that is the扩和更快的方法。你可以在这jsperf基准检查P></
在解决问题的rup' to the conditional comment add a s,by changing the first分裂below to the两线。但现在它的绝对精度均值比(EEA jsperf slower regexp)。P></
1
2
3
4
5function get(n) {
var half = location.search.split('&' + n + '=')[1];
if (!half) half = location.search.split('?' + n + '=')[1];
return half !== undefined ? decodeURIComponent(half.split('&')[0]) : null;
}我知道,如果你知道你不会遇见第rup'反住房,这效果。otherwise,正则表达式。P></
Or if you have control of the querystring and can guarantee that a value you are trying to get will never contain any URL encoded
characters (having these in a value would be a bad idea) - you can use
the following slightly more simplified and readable version of the 1st option:1
2
3function getQueryStringValueByName(name) {
var queryStringFromStartOfValue = location.search.split(name + '=')[1];
return queryStringFromStartOfValue !== undefined ? queryStringFromStartOfValue.split('&')[0] : null;- 非常整洁!但是,如果您有一个以您想要的键名结尾的早期值,例如
get('value') onhttp://the-url?oldvalue=1&value=2 ,它就不会起作用。 - 但是,如果您知道参数名是预期的,这将是更快的方法。
- 编辑:如果您只是测试
half 是否正确,那么对于像?param= 这样的空参数,它将返回空值。在这种情况下,它应该返回空字符串,检查half !== undefined 可以解决这个问题。 - 酷!我做了一个单程航班:
function get(param){return decodeURIComponent((location.search.split(param+'=')[1]||'').split('&')[0])} 。 - 我不得不把第二行改成
return half !== undefined ? decodeURIComponent(half[1].split('&')[0]) : null; 行,使它工作起来。
在这里,"我叫安迪在制作中的e的优秀解决方案的热情是一种全fledged jQuery插件: </P >
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24;(function ($) {
$.extend({
getQueryString: function (name) {
function parseParams() {
var params = {},
e,
a = /\+/g, // Regex for replacing addition symbol with a space
r = /([^&=]+)=?([^&]*)/g,
d = function (s) { return decodeURIComponent(s.replace(a,"")); },
q = window.location.search.substring(1);
while (e = r.exec(q))
params[d(e[1])] = d(e[2]);
return params;
}
if (!this.queryStringParams)
this.queryStringParams = parseParams();
return this.queryStringParams[name];
}
});
})(jQuery);的语法是: </P >
1var someVar = $.getQueryString('myParam');最好的纸的世界!!!!!!! </P >
如果你做的更多的是URL操作而不是简单地解析查询字符串,你可能会发现uri.js很有用。它是一个用于处理URL的库——附带了所有的铃声和口哨。(不好意思在这里做广告)
要将查询字符串转换为映射,请执行以下操作:
1
2
3
4
5var data = URI('?foo=bar&bar=baz&foo=world').query(true);
data == {
"foo": ["bar","world"],
"bar":"baz"
}(uri.js还"修复"了诸如
?&foo&&bar=baz& 到?foo&bar=baz 这样的错误查询字符串)- //需要加载src/uri.fragmenturi.js
- +1 uri.js是一个很棒的小插件。您也可以为相同的结果(docs)执行
var data = URI.parseQuery('?foo=bar&bar=baz&foo=world'); 。
我喜欢瑞安·菲兰的解决方案。但是我没有看到扩展jquery的任何意义?没有使用jquery功能。
另一方面,我喜欢Google Chrome:window.location.getParameter中的内置函数。
那么为什么不使用这个呢?好吧,其他浏览器没有。因此,如果这个函数不存在,我们就创建它:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22if (!window.location.getParameter ) {
window.location.getParameter = function(key) {
function parseParams() {
var params = {},
e,
a = /\+/g, // Regex for replacing addition symbol with a space
r = /([^&=]+)=?([^&]*)/g,
d = function (s) { return decodeURIComponent(s.replace(a,"")); },
q = window.location.search.substring(1);
while (e = r.exec(q))
params[d(e[1])] = d(e[2]);
return params;
}
if (!this.queryStringParams)
this.queryStringParams = parseParams();
return this.queryStringParams[key];
};
}这个函数或多或少来自RyanPhelan,但包装方式不同:名称清晰,不依赖于其他JavaScript库。有关此功能的详细信息,请访问我的博客。
- 看起来window.location.getParameter()已从chrome中删除。
here is a similar to get an object快速通道阵列_ get to the美元:PHP的P></
1
2
3
4
5
6
7
8
9function get_query(){
var url = location.search;
var qs = url.substring(url.indexOf('?') + 1).split('&');
for(var i = 0, result = {}; i < qs.length; i++){
qs[i] = qs[i].split('=');
result[qs[i][0]] = decodeURIComponent(qs[i][1]);
}
return result;
}用途:P></
1var $_GET = get_query();x=5&y&z=hello&x=6 this for the query string对象:归来》theP></1
2
3
4
5{
x:"6",
y: undefined,
z:"hello"
}- 如果您需要它作为jquery插件,这里是:
(function($) { $.extend({ get_query: function (name) { var url = location.href; var qs = url.substring(url.indexOf('?') + 1).split('&'); for(var i = 0, result = {}; i < qs.length; i++){ qs[i] = qs[i].split('='); result[qs[i][0]] = qs[i][1]; } return result; } }); })(jQuery); ,使用方法如下:$.get_query() 。 - 谢谢。我最后也用了这个。我在您的返回语句之前添加了这个:if(param)返回结果[param],这样,如果需要的话,我也可以获取查询("foo")。
- 如果你有哈希值就不工作。例如:test.aspx?TEST=T1默认值。将返回测试:"T1默认"我期望测试:"T1"
- @博格丹:的确。
location.href 将被location.search 取代。
简单明了的javascript代码:
1
2
3
4
5
6
7
8
9
10
11function qs(key) {
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[key];
}在javascript代码中的任意位置调用它:
1var result = qs('someKey');- 我认为你在做和我相似的事情,但我认为我的方法要简单得多stackoverflow.com/a/21152762/985454
- 我来给你介绍一下(德鲁姆罗尔)
window.location.search !
这些都是伟大的答案,但需要一些思想和位作为你的黑莓,我会喜欢有created。P></
它是简单的操作和dissection method that does Library of URL参数。method has the following the静电方法that can be called子主体的URL:P></
- gethost
- getpath
- gethash
- sethash
- getparams
- getquery
- setparam
- getparam
- hasparam
- removeparam
实例:P></
1URLParser(url).getParam('myparam1')1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140var url ="http://www.test.com/folder/mypage.html?myparam1=1&myparam2=2#something";
function URLParser(u){
var path="",query="",hash="",params;
if(u.indexOf("#") > 0){
hash = u.substr(u.indexOf("#") + 1);
u = u.substr(0 , u.indexOf("#"));
}
if(u.indexOf("?") > 0){
path = u.substr(0 , u.indexOf("?"));
query = u.substr(u.indexOf("?") + 1);
params= query.split('&');
}else
path = u;
return {
getHost: function(){
var hostexp = /\/\/([\w.-]*)/;
var match = hostexp.exec(path);
if (match != null && match.length > 1)
return match[1];
return"";
},
getPath: function(){
var pathexp = /\/\/[\w.-]*(?:\/([^?]*))/;
var match = pathexp.exec(path);
if (match != null && match.length > 1)
return match[1];
return"";
},
getHash: function(){
return hash;
},
getParams: function(){
return params
},
getQuery: function(){
return query;
},
setHash: function(value){
if(query.length > 0)
query ="?" + query;
if(value.length > 0)
query = query +"#" + value;
return path + query;
},
setParam: function(name, value){
if(!params){
params= new Array();
}
params.push(name + '=' + value);
for (var i = 0; i < params.length; i++) {
if(query.length > 0)
query +="&";
query += params[i];
}
if(query.length > 0)
query ="?" + query;
if(hash.length > 0)
query = query +"#" + hash;
return path + query;
},
getParam: function(name){
if(params){
for (var i = 0; i < params.length; i++) {
var pair = params[i].split('=');
if (decodeURIComponent(pair[0]) == name)
return decodeURIComponent(pair[1]);
}
}
console.log('Query variable %s not found', name);
},
hasParam: function(name){
if(params){
for (var i = 0; i < params.length; i++) {
var pair = params[i].split('=');
if (decodeURIComponent(pair[0]) == name)
return true;
}
}
console.log('Query variable %s not found', name);
},
removeParam: function(name){
query ="";
if(params){
var newparams = new Array();
for (var i = 0;i < params.length;i++) {
var pair = params[i].split('=');
if (decodeURIComponent(pair[0]) != name)
newparams .push(params[i]);
}
params = newparams;
for (var i = 0; i < params.length; i++) {
if(query.length > 0)
query +="&";
query += params[i];
}
}
if(query.length > 0)
query ="?" + query;
if(hash.length > 0)
query = query +"#" + hash;
return path + query;
},
}
}
document.write("Host:" + URLParser(url).getHost() + '');
document.write("Path:" + URLParser(url).getPath() + '');
document.write("Query:" + URLParser(url).getQuery() + '');
document.write("Hash:" + URLParser(url).getHash() + '');
document.write("Params Array:" + URLParser(url).getParams() + '');
document.write("Param:" + URLParser(url).getParam('myparam1') + '');
document.write("Has Param:" + URLParser(url).hasParam('myparam1') + '');
document.write(url + '');
// Remove the first parameter
url = URLParser(url).removeParam('myparam1');
document.write(url + ' - Remove the first parameter');
// Add a third parameter
url = URLParser(url).setParam('myparam3',3);
document.write(url + ' - Add a third parameter');
// Remove the second parameter
url = URLParser(url).removeParam('myparam2');
document.write(url + ' - Remove the second parameter');
// Add a hash
url = URLParser(url).setHash('newhash');
document.write(url + ' - Set Hash');
// Remove the last parameter
url = URLParser(url).removeParam('myparam3');
document.write(url + ' - Remove the last parameter');
// Remove a parameter that doesn't exist
url = URLParser(url).removeParam('myparam3');
document.write(url + ' - Remove a parameter that doesn"t exist');MDN from the:P></
1
2
3
4
5function loadPageVar (sVar) {
return unescape(window.location.search.replace(new RegExp("^(?:.*[&\\?]" + escape(sVar).replace(/[\.\+\*]/g,"\\$&") +"(?:\\=([^&]*))?)?.*$","i"),"$1"));
}
alert(loadPageVar("name"));
关于高尔夫: </P >
1
2
3
4
5var a = location.search&&location.search.substr(1).replace(/\+/gi,"").split("&");
for (var i in a) {
var s = a[i].split("=");
a[i] = a[unescape(s[0])] = unescape(s[1]);
}显示它!!!!!!! </P >
1
2
3for (i in a) {
document.write(i +":" + a[i] +"<br/>");
};麦克:我是
test.htm?i=can&has=cheezburger 显示器 </P >1
2
3
40:can
1:cheezburger
i:can
has:cheezburger- 我喜欢你的回答,尤其是脚本的紧凑程度,但你可能应该使用解码组件。请参阅xkr.us/articles/javascript/encode-compare和stackoverflow.com/questions/619323/&hellip;
- 是的,
unescape 没有正确处理uri。
我用正则表达式的方法很多,但不是说的。 </P >
它看来,easier和更高效,我们读到的查询字符串的一次,在我的应用程序,和建立的面向,从所有的键/值对的类: </P >
1
2
3
4
5
6
7
8
9
10var search = function() {
var s = window.location.search.substr(1),
p = s.split(/\&/), l = p.length, kv, r = {};
if (l === 0) {return false;}
while (l--) {
kv = p[l].split(/\=/);
r[kv[0]] = decodeURIComponent(kv[1] || '') || true;
}
return r;
}();一个URL类
http://domain.com?param1=val1¶m2=val2 你可以得到它们的值后在你的代码为search.param1 和search.param2 。。。。。。。 </P >
roshambo jQuery的方法不是T以照顾解码-12864LCD URL </P >
http://snipplr.com/view/26662/get-url-parameters-with-jquery--improved/
那是她的能力也在增在返回语句 </P >
1return decodeURIComponent(results[1].replace(/\+/g,"")) || 0;现在你可以找到的更新的依据: </P >
1
2
3
4
5$.urlParam = function(name){
var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
if (!results) { return 0; }
return decodeURIComponent(results[1].replace(/\+/g,"")) || 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18function GET() {
var data = [];
for(x = 0; x < arguments.length; ++x)
data.push(location.href.match(new RegExp("/\?".concat(arguments[x],"=","([^
&]*)")))[1])
return data;
}
example:
data = GET("id","name","foo");
query string : ?id=3&name=jet&foo=b
returns:
data[0] // 3
data[1] // jet
data[2] // b
or
alert(GET("id")[0]) // return 3- 这是一种感兴趣的方法,返回一个包含特定参数值的阵列。它至少有一个问题——不是正确的URL解码值,它需要URL编码在匹配中使用的参数名称。它将在它目前的形态中对简单的弦乐起作用。Ps don't forget to use the var keyword when declaring variants in for statements.
这是我对这个优秀答案的编辑——增加了用没有值的键解析查询字符串的能力。
1
2
3
4
5
6
7
8
9
10
11var url = 'http://sb.com/reg/step1?param';
var qs = (function(a) {
if (a =="") return {};
var b = {};
for (var i = 0; i < a.length; ++i) {
var p=a[i].split('=', 2);
if (p[1]) p[1] = decodeURIComponent(p[1].replace(/\+/g,""));
b[p[0]] = p[1];
}
return b;
})((url.split('?'))[1].split('&'));重要!最后一行中该函数的参数不同。这只是一个如何向它传递任意URL的示例。您可以使用布鲁诺答案的最后一行来解析当前的URL。
那么到底发生了什么变化?使用url EDOCX1[0]时,结果将相同。但是使用url
http://sb.com/reg/step1?param bruno的解决方案返回一个没有键的对象,而mine返回一个具有键param 和undefined 值的对象。我喜欢这个(摘自jquery howto.blogspot.co.uk):
1
2
3
4
5
6
7
8
9
10
11
12// get an array with all querystring values
// example: var valor = getUrlVars()["valor"];
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;
}对我来说很好。
面向对象的查询字符串from the needed安,和很多代码之恨。它不可能在宇宙最稳健的,但这只是一些lines of code。P></
1
2
3
4var q = {};
location.href.split('?')[1].split('&').forEach(function(i){
q[i.split('=')[0]]=i.split('=')[1];
});在
this.htm?hello=world&foo=bar 类将创建URL:P></1{hello:'world', foo:'bar'}- 整洁的不过,根据Mozilla的说法,foreach在IE7或IE8上不起作用,我怀疑如果根本没有查询字符串的话,这个问题就会迎刃而解。一个可以覆盖更多情况的最小改进是
decodeURIComponent ,即存储时的值,也可以说是密钥,但在这方面不太可能使用奇数字符串。 - 又好又简单。不处理数组参数,也不处理
?a&b&c ,但这是非常可读的(顺便说一下,与我的第一个想法类似)。另外,split 也是多余的,但我有比两次拆分10个字符的字符串更大的性能。 - 当querystring为""时?hello=world&one=a=b&two=2",那么当您获取值"one"时,您只会得到值中第一个"="之前的部分。它的值shud为"a=b",但您只得到"a",因为您在"="上拆分了"one=a=b"。这只是四轮马车。(:
- 我将使用
location.search.substr(1) 而不是location.href.split('?')[1] ,以避免在最后一个查询参数中拾取hash(#anchor )。 - 是的,我也给你介绍一下
location.search !
这是一个函数,我创造了一段时间后我quite与快乐。它是不敏感的案例-这是方便的。也,如果QS要求的不存在的T,它是安时返回空字符串。 </P >
我用一个压缩版本。I’m posting未压缩的类型我了解新手到更好的explain怎么走。 </P >
我担心这可能改进或有不同的工作做得更快,但它总是大的挤压方法什么是我需要的。 </P >
过尽情玩吧 </P >
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17function getQSP(sName, sURL) {
var theItmToRtn ="";
var theSrchStrg = location.search;
if (sURL) theSrchStrg = sURL;
var sOrig = theSrchStrg;
theSrchStrg = theSrchStrg.toUpperCase();
sName = sName.toUpperCase();
theSrchStrg = theSrchStrg.replace("?","&") theSrchStrg = theSrchStrg +"&";
var theSrchToken ="&" + sName +"=";
if (theSrchStrg.indexOf(theSrchToken) != -1) {
var theSrchTokenLth = theSrchToken.length;
var theSrchTokenLocStart = theSrchStrg.indexOf(theSrchToken) + theSrchTokenLth;
var theLocOfNextAndSign = theSrchStrg.indexOf("&", theSrchTokenLocStart);
theItmToRtn = unescape(sOrig.substring(theSrchTokenLocStart, theLocOfNextAndSign));
}
return unescape(theItmToRtn);
}- 另外,最好使用decodeUri()或decodeUriComponent(),而不是unescape()。developer.mozilla.org/en-us/docs/web/javascript/reference/&hellip;
这里是安迪E链接的"句柄数组样式查询字符串"的扩展版本。修复了一个bug(
?key=1&key[]=2&key[]=3 ;1 丢失并替换为[2,3] ),做了一些小的性能改进(重新解码值、重新计算"["位置等),并增加了一些改进(功能化、支持?key=1&key=2 、支持; 分隔符)。我把变量留得很短,但是添加了大量的注释以使它们可读(噢,我在本地函数中重用了v ,如果这让人困惑的话,很抱歉;)。它将处理以下查询字符串…
?test=Hello&person=neek&person[]=jeff&person[]=jim&person[extra]=john&test3&nocache=1398914891264
…把它变成一个看起来像…
1
2
3
4
5
6
7
8
9
10
11
12{
"test":"Hello",
"person": {
"0":"neek",
"1":"jeff",
"2":"jim",
"length": 3,
"extra":"john"
},
"test3":"",
"nocache":"1398914891264"
}正如您在上面看到的,这个版本处理一些"畸形"数组的度量,例如-
person=neek&person[]=jeff&person[]=jim 或person=neek&person=jeff&person=jim ,因为密钥是可识别和有效的(至少在dotnet的namevaluecollection.add中):If the specified key already exists in the target NameValueCollection
instance, the specified value is added to the existing comma-separated
list of values in the form"value1,value2,value3".由于没有规格说明,似乎对重复的密钥的判断有点不对。在这种情况下,多个密钥存储为(假)数组。但请注意,我不会将基于逗号的值处理到数组中。
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69getQueryStringKey = function(key) {
return getQueryStringAsObject()[key];
};
getQueryStringAsObject = function() {
var b, cv, e, k, ma, sk, v, r = {},
d = function (v) { return decodeURIComponent(v).replace(/\+/g,""); }, //# d(ecode) the v(alue)
q = window.location.search.substring(1), //# suggested: q = decodeURIComponent(window.location.search.substring(1)),
s = /([^&;=]+)=?([^&;]*)/g //# original regex that does not allow for ; as a delimiter: /([^&=]+)=?([^&]*)/g
;
//# ma(make array) out of the v(alue)
ma = function(v) {
//# If the passed v(alue) hasn't been setup as an object
if (typeof v !="object") {
//# Grab the cv(current value) then setup the v(alue) as an object
cv = v;
v = {};
v.length = 0;
//# If there was a cv(current value), .push it into the new v(alue)'s array
//# NOTE: This may or may not be 100% logical to do... but it's better than loosing the original value
if (cv) { Array.prototype.push.call(v, cv); }
}
return v;
};
//# While we still have key-value e(ntries) from the q(uerystring) via the s(earch regex)...
while (e = s.exec(q)) { //# while((e = s.exec(q)) !== null) {
//# Collect the open b(racket) location (if any) then set the d(ecoded) v(alue) from the above split key-value e(ntry)
b = e[1].indexOf("[");
v = d(e[2]);
//# As long as this is NOT a hash[]-style key-value e(ntry)
if (b < 0) { //# b =="-1"
//# d(ecode) the simple k(ey)
k = d(e[1]);
//# If the k(ey) already exists
if (r[k]) {
//# ma(make array) out of the k(ey) then .push the v(alue) into the k(ey)'s array in the r(eturn value)
r[k] = ma(r[k]);
Array.prototype.push.call(r[k], v);
}
//# Else this is a new k(ey), so just add the k(ey)/v(alue) into the r(eturn value)
else {
r[k] = v;
}
}
//# Else we've got ourselves a hash[]-style key-value e(ntry)
else {
//# Collect the d(ecoded) k(ey) and the d(ecoded) sk(sub-key) based on the b(racket) locations
k = d(e[1].slice(0, b));
sk = d(e[1].slice(b + 1, e[1].indexOf("]", b)));
//# ma(make array) out of the k(ey)
r[k] = ma(r[k]);
//# If we have a sk(sub-key), plug the v(alue) into it
if (sk) { r[k][sk] = v; }
//# Else .push the v(alue) into the k(ey)'s array
else { Array.prototype.push.call(r[k], v); }
}
}
//# Return the r(eturn value)
return r;
};- 要获取查询字符串值,可以使用此"getParameterValues"函数。在此,您只需传递查询string参数名称,它将返回值$(document).ready(函数()var bid=getParameterValues('token'););函数getParameterValues(param)var url=decodeUricomponent(window.location.href);url=url.slice(url.indexof('?')+1).split('&;');for(var i=0;i
- 我用这个已经有一段时间了,到目前为止还不错。除了处理URLENCODED数组。使用
q = decodeURIComponent(window.location.search.substring(1)), 也有助于实现这一点。 - 我用这个已经有一段时间了,到目前为止还不错。除了处理URLENCODED数组。使用
我们刚刚发布了arg.js,一个旨在一次性解决这个问题的项目。传统上很难做到,但现在你可以做到:
1var name = Arg.get("name");或者得到全部:
1var params = Arg.all();如果您关心
?query=true 和#hash=true 之间的区别,那么可以使用Arg.query() 和Arg.hash() 方法。- 你救了我,伙计……arg.js是一个解决方案,没有一个解决方案从IE 8中的获取值。(任何一个搜索IE8从请求中获取这是一个解决方案。)
这个问题的首要答案的问题是,它不支持放在之后的参数,但有时也需要获得这个值。
我修改了答案,让它用哈希符号解析完整的查询字符串:
1
2
3
4
5
6
7
8
9
10var getQueryStringData = function(name) {
var result = null;
var regexS ="[\\?&#]" + name +"=([^&#]*)";
var regex = new RegExp(regexS);
var results = regex.exec('?' + window.location.href.split('?')[1]);
if (results != null) {
result = decodeURIComponent(results[1].replace(/\+/g,""));
}
return result;
};- 如果你需要的话,这很有趣,但是对于hash部分afaik的格式没有标准,所以把它称为另一个答案的弱点是不公平的。
- 是的,我知道。但在我的应用程序中,我集成了第三方JS导航,它在散列符号之后有一些参数。
- 例如,在Google搜索页面中,搜索查询后跟哈希符号""。
1
2
3
4
5
6
7
8
9
10
11
12
13
14function GetQueryStringParams(sParam)
{
var sPageURL = window.location.search.substring(1);
var sURLVariables = sPageURL.split('&');
for (var i = 0; i < sURLVariables.length; i++)
{
var sParameterName = sURLVariables[i].split('=');
if (sParameterName[0] == sParam)
{
return sParameterName[1];
}
}
}?这样,你可以使用布尔函数assuming this is the URLP></
http://dummy.com/?stringtext=jquery&stringword=jquerybyexample 1
2var tech = GetQueryStringParams('stringtext');
var blog = GetQueryStringParams('stringword');- 这里已经有一些这种方法的实现。至少您需要解码component()结果值。如果不指定值,例如
?stringtext&stringword=foo ,这也可能会出现错误。
1http://someurl.com?key=value&keynovalue&keyemptyvalue=&&keynovalue=nowhasvalue#somehash- 常规键/值对(
?param=value ) - 无值键(
?param :无等号或值) - 带空值的键(
?param= :等号,但等号右边没有值) - 重复键(
?param=1¶m=2 ) - 删除空键(
?&& :无键或值)
代码:
-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17var queryString = window.location.search || '';
var keyValPairs = [];
var params = {};
queryString = queryString.substr(1);
if (queryString.length)
{
keyValPairs = queryString.split('&');
for (pairNum in keyValPairs)
{
var key = keyValPairs[pairNum].split('=')[0];
if (!key.length) continue;
if (typeof params[key] === 'undefined')
params[key] = [];
params[key].push(keyValPairs[pairNum].split('=')[1]);
}
}
如何称呼:
-
1params['key']; // returns an array of values (1..n)
输出:
-
1
2
3key ["value"]
keyemptyvalue [""]
keynovalue [undefined,"nowhasvalue"]
一个眼线to get the查询:P></
1var value = location.search.match(new RegExp(key +"=(.*?)($|\&)","i"))[1];- 触发错误如果密钥不存在,是否尝试此操作?
(location.search.match(new RegExp('kiosk_modeasdf' +"=(.*?)($|\&)","i")) || [])[1] - @布拉德,当然没有定义,因为这是你要找的钥匙。如果您的查询是?hello=world,
var value = location.search.match(new RegExp("hello" +"=(.*?)($|\&)","i"))[1]; 将返回"world" 。 - @Bradkoch我发现你的解决方案是最好的,尤其是对空字符串(window.location.search.match)短路(new regexp('kiosk_modeasdf'+"=(.*?)($&;)","i"))[][1]"';
- 我想你忘了从"?"开始测试钥匙了。或类似于"&;"的:var result=location.search.match(new regexp("[?&;]"+键+"=(.*?)($&;)","i"));
利用自行开发的小型图书馆技术listed here to an使用方便的创建,在下拉anyones solution to can be found here troubles;EN:P></
HTTPS:/ / / /查询github.com nijikokun JSP></
usageP></
特异性的关键参数:fetchingP></
1query.get('param');using the to the全部对象:取器P></
1
2var storage = query.build();
console.log(storage.param);吨和更多……check for the examples GitHub的更多链接。P></
特点P></
- 参数解码和缓存都在线
- supports
#hello?page=3 查询字符串哈希- 通过自定义的查询supports
- supports /对象
user[]="jim"&user[]="bob" 阵列参数- 管理
&& supports empty- supports参数没有值
name&hello="world" 宣言- supports
param=1¶m=2 重复灌水参数- 清洁,紧凑和可读的源代码,
4kb - 支持AMD,require,节点
如果使用browserify,则可以使用node.js中的
url 模块:1
2
3
4
5var url = require('url');
url.parse('http://example.com/?bob=123', true).query;
// returns {"bob":"123" }进一步阅读:url node.js v0.12.2手册和文档
编辑:你可以使用url接口,它在几乎所有的新浏览器中都被广泛采用,如果代码要在旧浏览器上运行,你可以使用像这样的polyfill。下面是一个关于如何使用URL接口获取查询参数(即搜索参数)的代码示例。
1
2const url = new URL('http://example.com/?bob=123');
url.searchParams.get('bob');您还可以使用urlsearchparams,下面是MDN中的一个示例,用于处理urlsearchparams:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18var paramsString ="q=URLUtils.searchParams&topic=api";
var searchParams = new URLSearchParams(paramsString);
//Iterate the search parameters.
for (let p of searchParams) {
console.log(p);
}
searchParams.has("topic") === true; // true
searchParams.get("topic") ==="api"; // true
searchParams.getAll("topic"); // ["api"]
searchParams.get("foo") === null; // true
searchParams.append("topic","webdev");
searchParams.toString(); //"q=URLUtils.searchParams&topic=api&topic=webdev"
searchParams.set("topic","More webdev");
searchParams.toString(); //"q=URLUtils.searchParams&topic=More+webdev"
searchParams.delete("topic");
searchParams.toString(); //"q=URLUtils.searchParams"url 模块API的文档如下:nodejs.org/api/url.html- 这对于nw.js开发很好。由于大多数节点模块的工作方式与nw.js窗口中的相同,因此甚至不需要浏览。我已经测试了这段代码,而且工作起来很有魅力,没有任何修改。
非常轻量级的jquery方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15var qs = window.location.search.replace('?','').split('&'),
request = {};
$.each(qs, function(i,v) {
var initial, pair = v.split('=');
if(initial = request[pair[0]]){
if(!$.isArray(initial)) {
request[pair[0]] = [initial]
}
request[pair[0]].push(pair[1]);
} else {
request[pair[0]] = pair[1];
}
return;
});
console.log(request);比如说提醒?Q
1alert(request.q)- 整洁的已经有了一些相同的答案——迭代一个分割——尽管没有使用jquery的每个答案,我认为它们中的任何一个都不是完美的。不过,我不理解你的结尾中的
return ,我认为你在阅读时需要decodeURIComponent 两个pair[] 值。 - 是的,拥有解码组件是定义的最佳实践-我只是有点随时随地写的。至于回报……我只是保持着归还东西的习惯。完全没有必要
- 不适合吗?foo=1&foo=2,尽管…
这里是我的版本的查询字符串解析GitHub的代码。 </P >
它的"prefixed"与jQuery。*,但解析函数本身不使用jQuery。它的相当快速,但它的开放设计的几个简单的性能优化。 </P >
它也支持列表&;哈希表中的URL编码,如: </P >
1arr[]=10&arr[]=20&arr[]=100或 </P >
1hash[key1]=hello&hash[key2]=moto&a=How%20are%20you1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43jQuery.toQueryParams = function(str, separator) {
separator = separator || '&'
var obj = {}
if (str.length == 0)
return obj
var c = str.substr(0,1)
var s = c=='?' || c=='#' ? str.substr(1) : str;
var a = s.split(separator)
for (var i=0; i<a.length; i++) {
var p = a[i].indexOf('=')
if (p < 0) {
obj[a[i]] = ''
continue
}
var k = decodeURIComponent(a[i].substr(0,p)),
v = decodeURIComponent(a[i].substr(p+1))
var bps = k.indexOf('[')
if (bps < 0) {
obj[k] = v
continue;
}
var bpe = k.substr(bps+1).indexOf(']')
if (bpe < 0) {
obj[k] = v
continue;
}
var bpv = k.substr(bps+1, bps+bpe-1)
var k = k.substr(0,bps)
if (bpv.length <= 0) {
if (typeof(obj[k]) != 'object') obj[k] = []
obj[k].push(v)
} else {
if (typeof(obj[k]) != 'object') obj[k] = {}
obj[k][bpv] = v
}
}
return obj;
}我使用的是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40/**
* Examples:
* getUrlParams()['myparam'] // url defaults to the current page
* getUrlParams(url)['myparam'] // url can be just a query string
*
* Results of calling `getUrlParams(url)['myparam']` with various urls:
* example.com (undefined)
* example.com? (undefined)
* example.com?myparam (empty string)
* example.com?myparam= (empty string)
* example.com?myparam=0 (the string '0')
* example.com?myparam=0&myparam=override (the string 'override')
*
* Origin: http://stackoverflow.com/a/23946023/2407309
*/
function getUrlParams (url) {
var urlParams = {} // return value
var queryString = getQueryString()
if (queryString) {
var keyValuePairs = queryString.split('&')
for (var i = 0; i < keyValuePairs.length; i++) {
var keyValuePair = keyValuePairs[i].split('=')
var paramName = keyValuePair[0]
var paramValue = keyValuePair[1] || ''
urlParams[paramName] = decodeURIComponent(paramValue.replace(/\+/g, ' '))
}
}
return urlParams // functions below
function getQueryString () {
var reducedUrl = url || window.location.search
reducedUrl = reducedUrl.split('#')[0] // Discard fragment identifier.
var queryString = reducedUrl.split('?')[1]
if (!queryString) {
if (reducedUrl.search('=') !== false) { // URL is a query string.
queryString = reducedUrl
}
}
return queryString
} // getQueryString
} // getUrlParams在最后一种情况下,返回"override"而不是"0"使其与php一致。在IE7中工作。
- 这是因为每个人在处理没有值的键或通过构建值数组来处理重复的键等方面似乎都有不同的要求。已经有很多拆分的答案,但我没有看到一个和这个完全相同的答案,真的。(fwiw我认为
paramName 在技术上也需要decodeURIComponent ed,尽管我怀疑有人会使用非琐碎的参数。) - 参数名不应该需要解码。
- 为什么不?HTML5不限制输入控件名称的字符集,也不保证它们来自HTML。我不明白为什么对可打印字符有限制。
- 这从来都不是好的练习。
- 解决方案很好,但是为什么语句末尾没有分号呢?
- @因为没有理由拥有它们。大多数人之所以包含它们,仅仅是因为他们总是看到其他人包含它们,并且因为其他语言需要它们;通常在JavaScript中也错误地认为它们是必需的,这有时会导致令人困惑的问题。无缘无故的事情通常是误导性的,JavaScript不是C++或PHP。查一下
defensive semicolon 。 - "令人惊讶的是,这里发布了多少过于复杂和不完整的解决方案",哈哈,讽刺的是……
我会去大学的
split() ,使用正则表达式的方法这样的操作: </P >1
2
3
4
5
6
7
8
9
10
11function getUrlParams() {
var result = {};
var params = (window.location.search.split('?')[1] || '').split('&');
for(var param in params) {
if (params.hasOwnProperty(param)) {
var paramParts = params[param].split('=');
result[paramParts[0]] = decodeURIComponent(paramParts[1] ||"");
}
}
return result;
}- 我不想使用regex,就用了这个解决方案。我觉得它很好用。谢谢!
获取所有querystring参数,包括复选框值(数组)。
考虑到get参数的正确和正常使用,在大多数函数中,我认为它缺少对数组和删除哈希数据的支持。
所以我写了这个函数:
1
2
3
4
5
6
7
8
9
10
11function qs(a){
if(!a)return {};
a=a.split('#')[0].split('&');
var b=a.length,c={},d,k,v;
while(b--){
d=a[b].split('=');
k=d[0].replace('[]',''),v=decodeURIComponent(d[1]||'');
c[k]?typeof c[k]==='string'?(c[k]=[v,c[k]]):(c[k].unshift(v)):c[k]=v;
}
return c
}使用速记运算符&while--loop,性能应该非常好。
支持:
- 空值(key=/key)
- 键值(key=value)
- 数组(键[]=值)
- 散列(散列标记被拆分)
笔记:
它不支持对象数组(key[key]=value)
如果空格为+则保持为A+。
如有需要,加上
.replace(/\+/g,"") 。用途:
1qs('array[]=1&array[]=2&key=value&empty=&empty2#hash')返回:
1
2
3
4
5
6
7
8{
"empty":"",
"key":"value",
"array": [
"1",
"2"
]
}演示:
http://jsfiddle.net/zqmrt/1/
信息
如果你不明白某件事,或者你读不懂函数,就问问。我很乐意解释我在这里做了什么。
如果您认为该函数不可读且不可维护,我很乐意为您重写该函数,但请考虑速记&位运算符总是比标准语法更快(可以阅读ECMA-262书中的速记和位运算符,或者使用您最喜欢的搜索引擎)。用标准可读语法重写代码意味着性能下降。
- 非常整洁,尽管我很难相信,写它预缩微实际上除了第一个解析,帮助任何东西,或一般帮助,如果人们要缩微他们的生产代码无论如何。这里的大多数函数不需要去掉散列部分,因为它们从不包含散列部分的
location.search 开始。我也不清楚你所说的"位运算符"是什么意思——你使用的是空的或未定义的,在一些地方是假的,这是你所能得到的,但这里没有位操作。 - stackoverflow.com/a/21353032/2450730
- 如果对多个复选框值使用数组,请添加:if(v.charat(0)='[')v=v.replace('['、'["').replace(']、']').replace(','、''、''、'');v=json&;&;json.parse(v)$.parsejson(v);before"c[k]?"……"
对于那些想要短方法(有限制)的人:
1location.search.split('myParameter=')[1]- 对于一般情况来说,这还不够:它假定1)您只对一个参数感兴趣2)它保证是行中的最后一个参数(即,您可以保证所有浏览器都将它放在最后,或者它是页面上唯一的参数,并且您不会将URL放在RSS提要聚合器中,它可能会添加的ET UTM参数)和3)表示值中没有可转义用于传输的字符,例如空格或多个符号。
- 没有一种适合所有方法的尺寸。如果你有一个完美的解决方案在一个短的班轮,我将全神贯注地检查。上面是一个快速的解决方案,不适用于一般情况,而是适用于那些希望对静态实现有一个轻量级和快速的解决方案的编码人员。无论如何,谢谢你的评论。
- (location.search.split('myParameter='[1]).split('&;')[0];如果有多个参数,则会得到相同的结果。仍然只对静态实现有用。
这个很好用
1
2
3
4
5
6
7
8
9
10function getQuerystring(key) {
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split("=");
if (pair[0] == key) {
return pair[1];
}
}
}从这里夺走
- 如果没有像这里所有其他解决方案一样,首先用空格替换plus,那么在返回之前,您可能至少要在
pair[1] 上调用decodeUriComponent 。其他一些解决方案也希望拆分= 上的限制为2个部分,以便更宽松地接受输入。 - @你是对的…实际上在我的代码中,它总是一个数字,而不是任何特殊的字符,所以错过了…
1
2
3
4function getUrlVar(key){
var result = new RegExp(key +"=([^&]*)","i").exec(window.location.search);
return result && unescape(result[1]) ||"";
}https://gist.github.com/1771618
这converts the QueryString函数对象的JSON样值,它也无把手和多值参数:P></
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20"use strict";
function getQuerystringData(name) {
var data = { };
var parameters = window.location.search.substring(1).split("&");
for (var i = 0, j = parameters.length; i < j; i++) {
var parameter = parameters[i].split("=");
var parameterName = decodeURIComponent(parameter[0]);
var parameterValue = typeof parameter[1] ==="undefined" ? parameter[1] : decodeURIComponent(parameter[1]);
var dataType = typeof data[parameterName];
if (dataType ==="undefined") {
data[parameterName] = parameterValue;
} else if (dataType ==="array") {
data[parameterName].push(parameterValue);
} else {
data[parameterName] = [data[parameterName]];
data[parameterName].push(parameterValue);
}
}
return typeof name ==="string" ? data[name] : data;
}我们在网上做
undefined check for theparameter[1] 因为decodeURIComponent 归来字符串"if the variable isundefined Undefined",和那是错误的。P></用途:P></
1
2
3"use strict";
var data = getQuerystringData();
var parameterValue = getQuerystringData("parameterName");以下代码将创建一个具有两种方法的对象:
isKeyExist :检查是否存在特定参数getValue :获取特定参数的值。nbsp;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28var QSParam = new function() {
var qsParm = {};
var query = window.location.search.substring(1);
var params = query.split('&');
for (var i = 0; i < params.length; i++) {
var pos = params[i].indexOf('=');
if (pos > 0) {
var key = params[i].substring(0, pos);
var val = params[i].substring(pos + 1);
qsParm[key] = val;
}
}
this.isKeyExist = function(query){
if(qsParm[query]){
return true;
}
else{
return false;
}
};
this.getValue = function(query){
if(qsParm[query])
{
return qsParm[query];
}
throw"URL does not contain query"+ query;
}
};试试这个:
1
2
3
4String.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(/(&|;|$)/))) :"";
};然后这样称呼它:
1if(location.search !="") location.search.getValueByKey("id");您也可以将此用于cookies:
1if(navigator.cookieEnabled) document.cookie.getValueByKey("username");这只适用于具有
key=value[&|;|$] 的字符串…不适用于对象/数组。如果不想使用string.prototype…将其移动到函数并将字符串作为参数传递
我使用此代码(javascript)获取通过URL传递的内容:
1
2
3
4
5
6
7function getUrlVars() {
var vars = {};
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
vars[key] = value;
});
return vars;
}然后,要将值赋给变量,只需指定要获取的参数,即如果URL是
example.com/?I=1&p=2&f=3 。您可以这样做以获取值:
1
2
3var getI = getUrlVars()["I"];
var getP = getUrlVars()["p"];
var getF = getUrlVars()["f"];那么这些值是:
1getI = 1, getP = 2 and getF = 3- 这很好,虽然它在键和值上缺少
decodeURIComponent ,而且您可能不需要在regexp上使用i 标志(这并不重要)。 - 但是如果您有example.com/3(MVC路由),该怎么办?
我在这里为我的需要做了一个小的URL库:https://github.com/mikhus/jsurl
这是一种更常见的在javascript中操作URL的方法。同时,它非常轻(小型化和gzipped<1 kb),并且有一个非常简单和干净的API。它不需要任何其他的图书馆来工作。
关于最初的问题,很容易做到:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15var u = new Url; // Current document URL
// or
var u = new Url('http://user:[email protected]:8080/some/path?foo=bar&bar=baz#anchor');
// Looking for query string parameters
alert( u.query.bar);
alert( u.query.foo);
// Modifying query string parameters
u.query.foo = 'bla';
u.query.woo = ['hi', 'hey']
alert(u.query.foo);
alert(u.query.woo);
alert(u);- 这很有趣。为什么要手动解码该值?您还将限制可以接受为UTF-8的顶级字符代码,尽管我意识到您在实践中不太可能实现这一点。
- 为什么要用这种方式解码:unixpapa.com/js/querystring.html事实上,我从那里获得了这个想法的代码,在我的脚本的顶级注释中说明了什么。
以下函数返回查询字符串的对象版本。只需编写
obj.key1 和obj.key2 就可以访问参数中key1 和key2 的值。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17function getQueryStringObject()
{
var querystring = document.location.search.replace('?','').split( '&' );
var objQueryString={};
var key="",val="";
if(typeof querystring == 'undefined')
{
return (typeof querystring);
}
for(i=0;i<querystring.length;i++)
{
key=querystring[i].split("=")[0];
val=querystring[i].split("=")[1];
objQueryString[key] = val;
}
return objQueryString;
}要使用这个函数,你可以写
1
2var obj= getQueryStringObject();
alert(obj.key1);这是我自己的看法。第一个函数将URL字符串解码为名称/值对的对象:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16url_args_decode = function (url) {
var args_enc, el, i, nameval, ret;
ret = {};
// use the DOM to parse the URL via an 'a' element
el = document.createElement("a");
el.href = url;
// strip off initial ? on search and split
args_enc = el.search.substring(1).split('&');
for (i = 0; i < args_enc.length; i++) {
// convert + into space, split on =, and then decode
args_enc[i].replace(/\+/g, ' ');
nameval = args_enc[i].split('=', 2);
ret[decodeURIComponent(nameval[0])]=decodeURIComponent(nameval[1]);
}
return ret;
};另外,如果您更改了一些参数,则可以使用第二个函数将参数数组放回URL字符串:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21url_args_replace = function (url, args) {
var args_enc, el, name;
// use the DOM to parse the URL via an 'a' element
el = document.createElement("a");
el.href = url;
args_enc = [];
// encode args to go into url
for (name in args) {
if (args.hasOwnProperty(name)) {
name = encodeURIComponent(name);
args[name] = encodeURIComponent(args[name]);
args_enc.push(name + '=' + args[name]);
}
}
if (args_enc.length > 0) {
el.search = '?' + args_enc.join('&');
} else {
el.search = '';
}
return el.href;
};- 如果您仍然使用jquery,那么后面的方法(
url_args_replace 可以通过$.param() 使用。 - 为什么使用document.createElement("a")?
- @greg在浏览器引擎中创建元素,它将为您解析一个URL,并提供与URL字符串交互的搜索和href方法。
一个简单的解决方案,简单的javascript和正则表达式:
1
2
3
4
5alert(getQueryString("p2"));
function getQueryString (Param) {
return decodeURI("http://www.example.com/?p1=p11&p2=p2222".replace(new RegExp("^(?:.*[&?]" + encodeURI(Param).replace(/[.+*]/g,"$&") +"(?:=([^&]*))?)?.*$","i"),"$1"));
}杰西德
如果您有underline.js或lodash,一个快速而肮脏的方法可以做到这一点:
1_.object(window.location.search.slice(1).split('&').map(function (val) { return val.split('='); }));- 整洁的与顶部基于拆分的答案相比,虽然您缺少对+s和解码组件调用的处理,但对于简单值来说,这就足够了。
- 是的,它实际上只是用来获取简单的字母数字标记。在当前的项目中,这是我所需要的,所以我不想真正需要一个庞大的函数。
- 这是我用来生成查询参数的键值对象:
_.chain(document.location.search.slice(1).split('&')).invoke('split', '=').object().value() 。
这个简单的JavaScript布尔函数的最小值int ANS to get from URL字符串参数P></
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19/* THIS FUNCTION IS TO FETCH INT PARAMETER VALUES */
function getParameterint(param) {
var val = document.URL;
var url = val.substr(val.indexOf(param))
var n=parseInt(url.replace(param+"=",""));
alert(n);
}
getParameteraint("page");
getParameteraint("pagee");
/*THIS FUNCTION IS TO FETCH STRING PARAMETER*/
function getParameterstr(param) {
var val = document.URL;
var url = val.substr(val.indexOf(param))
var n=url.replace(param+"=","");
alert(n);
}
getParameterstr("str");源代码和演示:http:/ / / / / how-to-get-url-parameter-in-javascript.html bloggerplugnplay.blogspot.in 2012年08P></
- 我认为这很容易被击败,例如,
?xyz=page&str=Expected&page=123 不会返回123,因为它从xyz=page 中提取了page 字符串,而str 将返回Expected&page=123 ,而不是仅返回Expected ,如果它不是行中的最后一个值,等等。您也不会对提取的值进行解码。另外,我不能尝试你的演示-我被重定向到一个赌博网站?? - @你说的是一个罕见/最坏的情况。但在正常和常规情况下,这段代码可以很好地工作并解决了这个问题……关于演示,它可以很好地工作并演示这个函数是如何工作的!谢谢!
- 好的,最终通过Adfly获得了您的演示。是的,这没问题,但仅仅是因为只有一个字符串参数,而且是最后一个参数——尝试使用多个参数并切换顺序。尝试将page参数放在page参数之前,它将失败。例如,这里是您的演示,其中三个顺序颠倒。另一个问题是,如果有人发布了一个包含非ASCII字符的字符串,例如一个空格,那么它将得到对URI的编码,而您随后不会对其进行解码。
我把我的答案和附加支持optionally通过在URL中的作为一个参数;瀑布回到window.location.search。。。。。。。obviously这是有用的方法获取的查询字符串参数的URL是不说,从目前的页面: </P >
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21(function($, undef) {
$.QueryString = function(url) {
var pairs, qs = null, index, map = {};
if(url == undef){
qs = window.location.search.substr(1);
}else{
index = url.indexOf('?');
if(index == -1) return {};
qs = url.substring(index+1);
}
pairs = qs.split('&');
if (pairs =="") return {};
for (var i = 0; i < pairs.length; ++i)
{
var p = pairs[i].split('=');
if(p.length != 2) continue;
map[p[0]] = decodeURIComponent(p[1].replace(/\+/g,""));
}
return map;
};
})(jQuery);在很小
url there is for this with some酷sugaring效用:P></1
2
3
4
5
6
7
8
9
10
11
12http://www.example.com/path/index.html?silly=willy#chucky=cheese
url(); // http://www.example.com/path/index.html?silly=willy#chucky=cheese
url('domain'); // example.com
url('1'); // path
url('-1'); // index.html
url('?'); // silly=willy
url('?silly'); // willy
url('?poo'); // (an empty string)
url('#'); // chucky=cheese
url('#chucky'); // cheese
url('#poo'); // (an empty string)退房在examples和更多下载:github.com HTTPS:/ / / websanova JS—# URL URLP></
检索uri查询值的解决方案有很多,我更喜欢这一个,因为它很短,而且效果很好:
1
2
3
4function get(name){
if(name=(new RegExp('[?&]'+encodeURIComponent(name)+'=([^&]*)')).exec(location.search))
return decodeURIComponent(name[1]);
}- 这很好,虽然这基本上是最容易接受的答案,但有一点被简化了,例如,你已经失去了对值中空格的加号的解码。不过,密钥名称的
encodeURIComponent 是新的,一方面考虑到密钥中的编码比公认的答案更正确,但另一方面仍然会错过非最小编码,例如get("key") 与?k%65y=value 不匹配。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16var getUrlParameters = function (name, url) {
if (!name) {
return undefined;
}
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
url = url || location.search;
var regex = new RegExp('[\\?&#]' + name + '=?([^&#]*)', 'gi'), result, resultList = [];
while (result = regex.exec(url)) {
resultList.push(decodeURIComponent(result[1].replace(/\+/g, ' ')));
}
return resultList.length ? resultList.length === 1 ? resultList[0] : resultList : undefined;
};- 这比公认的在查询字符串中处理数组值的解决方案要好得多。即arr[]=1&arr[]=2
node.js的源代码中有一个强大的实现https://github.com/joyent/node/blob/master/lib/querystring.js
另外,TJ的qs执行嵌套参数解析https://github.com/visionmedia/node-querystring
如果需要数组样式参数,url.js支持任意嵌套的数组样式参数以及字符串索引(maps)。它还处理URL解码。
1
2
3
4
5
6
7
8
9
10
11
12
13url.get("val[0]=zero&val[1]=one&val[2]&val[3]=&val[4]=four&val[5][0]=n1&val[5][1]=n2&val[5][2]=n3&key=val", {array:true});
// Result
{
val: [
'zero',
'one',
true,
'',
'four',
[ 'n1', 'n2', 'n3' ]
]
key: 'val'
}我认为这是实现这一点的一种精确而简洁的方法(从http://css tricks.com/snippets/javascript/get url variables/修改):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15function getQueryVariable(variable) {
var query = window.location.search.substring(1), // Remove the ? from the query string.
vars = query.split("&"); // Split all values by ampersand.
for (var i = 0; i < vars.length; i++) { // Loop through them...
var pair = vars[i].split("="); // Split the name from the value.
if (pair[0] == variable) { // Once the requested value is found...
return ( pair[1] == undefined ) ? null : pair[1]; // Return null if there is no value (no equals sign), otherwise return the value.
}
}
return undefined; // Wasn't found.
}- 这看起来很合理!您可能需要对查询字符串中获取的值进行解码,以防它们已经编码,以便与%s或+s一起提交。
最漂亮但最基本的:
1
2
3
4
5
6
7
8
9data = {};
$.each(
location.search.substr(1).split('&').filter(Boolean).map(function(kvpairs){
return kvpairs.split('=')
}),
function(i,values) {
data[values.shift()] = values.join('=')
}
);它不处理值列表,如
?a[]=1&a[]2 。- 整洁!你可能需要修剪前面的"?"在第一项中(我不知道这是否总是必要的,但这里有很多答案),你也需要执行一些不加掩饰的价值(
decodeURIComponent ,加上空格) - 绝对感谢,而且当location.search为空时,我们还需要一个.filter(布尔值)来删除列表中的空字符串项。即:
location.search.substr(1).split('&').filter(Boolean).map(... 。 - 反过来:返回的hashmap中的查询字符串:
$.map(queryhash, function(v,k){ return [k,v].join('=')}).join('&')
这是获取参数值(查询字符串)的非常简单的方法。
使用
gV(para_name) 函数检索其值1
2
3
4
5
6
7
8
9var a=window.location.search;
a=a.replace(a.charAt(0),""); //Removes '?'
a=a.split("&");
function gV(x){
for(i=0;i<a.length;i++){
var b=a[i].substr(0,a[i].indexOf("="));
if(x==b){
return a[i].substr(a[i].indexOf("=")+1,a[i].length)}如果不想使用javascript库,可以使用javascript字符串函数来解析
window.location 。将此代码保存在一个外部.js文件中,您可以在不同的项目中反复使用它。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24// Example - window.location ="index.htm?name=bob";
var value = getParameterValue("name");
alert("name =" + value);
function getParameterValue(param)
{
var url = window.location;
var parts = url.split('?');
var params = parts[1].split('&');
var val ="";
for ( var i=0; i<params.length; i++)
{
var paramNameVal = params[i].split('=');
if ( paramNameVal[0] == param )
{
val = paramNameVal[1];
}
}
return val;
}用途:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17$(document).ready(function () {
var urlParams = {};
(function () {
var match,
pl = /\+/g, // Regex for replacing addition symbol with a space
search = /([^&=]+)=?([^&]*)/g,
decode = function (s) {
return decodeURIComponent(s.replace(pl,""));
},
query = window.location.search.substring(1);
while (match = search.exec(query))
urlParams[decode(match[1])] = decode(match[2]);
})();
if (urlParams["q1"] === 1) {
return 1;
}请检查并告诉我您的意见。另请参阅如何使用jquery获取querystring值。
- 这和Soheil的答案是一样的,它本身就是用jquery包装的安迪E的答案的副本,并在最后检查。在最后一节中,您还复制了Soheil的错误:
urlParams["q1"] 不可能是=== 1 ,因为在那一点上它总是一个字符串而不是整数,而且来自$(document).ready() 的return 1 也没有真正意义。你从哪里得到这个代码的? - @RUP:我从codeproject.com/tips/529496/handling querystring使用jquer&zwnj;&8203;y得到了这个。
我推荐DAR课程作为一个好的插件。我已经用了很长时间了。您还可以使用以下代码。jus把
var queryObj = {}; 放在document.ready之前,把下面的代码放在document.ready的开头。在这段代码之后,您可以对您拥有的任何查询对象使用queryObj["queryObjectName"] 。1
2
3
4
5
6var querystring = location.search.replace('?', '').split('&');
for (var i = 0; i < querystring.length; i++) {
var name = querystring[i].split('=')[0];
var value = querystring[i].split('=')[1];
queryObj[name] = value;
}- 在两个岗位上有两个DAR课程的插头?我认为我们至少不能推荐当前版本:它容易受到脚本注入攻击。(我给他发了电子邮件让他知道)。就像很多
split('=') 解决方案一样,您已经错过了decodeURIComponent ,您可能也希望更优雅地处理丢失的值。 - DAR课程现在发布了1.1,它修复了脚本注入攻击。
(P)这将是一个URL String的变量和阵列。It used neither regex or any external library.(p)字母名称(P)例如:(p)字母名称(P)Output:(p)字母名称就获取查询对象的大小而言,最短的表达式可能是:
1
2
3var params = {};
location.search.substr(1).replace(/([^&=]*)=([^&]*)&?/g,
function () { params[decodeURIComponent(arguments[1])] = decodeURIComponent(arguments[2]); });您可以使用
A 元素将一个uri从一个字符串解析为它的location 类组件(例如,为了去掉#... ):1
2
3var a = document.createElement('a');
a.href = url;
// Parse a.search.substr(1)... as above这里是
String 原型实现:1
2
3
4
5
6
7
8
9
10String.prototype.getParam = function( str ){
str = str.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
var regex = new RegExp("[\\?&]*"+str+"=([^&#]*)" );
var results = regex.exec( this );
if( results == null ){
return"";
} else {
return results[1];
}
}示例调用:
1var status = str.getParam("status")str 可以是查询字符串或url- 不过,这基本上和最上面的答案是一样的,少了一些不加掩饰的,只是放上了字符串。
- @RUP这对于解析任何字符串查询都很有用,而不仅仅是在URL中。例如,OAuth2将令牌响应作为查询字符串返回,这个字符串原型对于解析非常有用,最重要的是regexp中的
[\\?&]* 而不是[\\?&] ,用于解析以新行开头的查询字符串。
此函数将根据需要使用递归返回带有任意嵌套值的已分析的javascript对象。
下面是一个JSfiddle示例。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27[
'?a=a',
'&b=a',
'&b=b',
'&c[]=a',
'&c[]=b',
'&d[a]=a',
'&d[a]=x',
'&e[a][]=a',
'&e[a][]=b',
'&f[a][b]=a',
'&f[a][b]=x',
'&g[a][b][]=a',
'&g[a][b][]=b',
'&h=%2B+%25',
'&i[aa=b',
'&i[]=b',
'&j=',
'&k',
'&=l',
'&abc=foo',
'&def=%5Basf%5D',
'&ghi=[j%3Dkl]',
'&xy%3Dz=5',
'&foo=b%3Dar',
'&xy%5Bz=5'
].join('');给出上述任何测试示例。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45var qs = function(a) {
var b, c, e;
b = {};
c = function(d) {
return d && decodeURIComponent(d.replace(/\+/g,""));
};
e = function(f, g, h) {
var i, j, k, l;
h = h ? h : null;
i = /(.+?)\[(.+?)?\](.+)?/g.exec(g);
if (i) {
[j, k, l] = [i[1], i[2], i[3]]
if (k === void 0) {
if (f[j] === void 0) {
f[j] = [];
}
f[j].push(h);
} else {
if (typeof f[j] !=="object") {
f[j] = {};
}
if (l) {
e(f[j], k + l, h);
} else {
e(f[j], k, h);
}
}
} else {
if (f.hasOwnProperty(g)) {
if (Array.isArray(f[g])) {
f[g].push(h);
} else {
f[g] = [].concat.apply([f[g]], [h]);
}
} else {
f[g] = h;
}
return f[g];
}
};
a.replace(/^(\?|#)/,"").replace(/([^#&=?]+)?=?([^&=]+)?/g, function(m, n, o) {
n && e(b, c(n), c(o));
});
return b;
};- 看起来不错,但为什么要预先缩小呢?很难按原样去做,特别是你在右方括号周围做了一些讨厌的事情。同样,像
c[xx=a&c[]=b 这样的输入也会使它崩溃。 - 我的目的不是预先缩小它,而是在命名变量方面很差劲,所以我没有试图想出更好的名称。我修改了代码以适应您的示例输入并做出适当的响应。我还改为使用regex,而不是尝试分割字符串(正如您指出的,这并不总是有效)。
快速、简单和快速:
功能:
1
2
3
4
5
6
7
8function getUrlVar() {
var result = {};
var location = window.location.href.split('#');
var parts = location[0].replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
result [key] = value;
});
return result;
}用途:
1var varRequest = getUrlVar()["theUrlVarName"];- 这类似于第四个答案,尽管逃逸较少,而且您不接受只有
?key 个这样的参数(尽管您不再看到它们)。我不确定您是否需要regexp选项上的i ,并且您正在使用整个href,而不仅仅是搜索部分,这看起来很奇怪,但不应该有什么区别。 - @你好,谢谢你的评论-我看不出有什么相似之处…他使用的
decodeURIComponent 非常有用,但是如果我们用重音字符来尝试它——在某些情况下,它失败了(大部分是ff),正如你所看到的,我的答案简单而快速,适合大多数需要快速解决查询字符串变量提取的程序员。添加i(不区分大小写)有点灵活,但可以删除,我同意。
查看此文章或使用此:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21<script type="text/javascript" language="javascript">
$(document).ready(function()
{
var urlParams = {};
(function ()
{
var match,
pl= /\+/g, // Regular expression for replacing addition symbol with a space
search = /([^&=]+)=?([^&]*)/g,
decode = function (s) { return decodeURIComponent(s.replace(pl,"")); },
query = window.location.search.substring(1);
while (match = search.exec(query))
urlParams[decode(match[1])] = decode(match[2]);
})();
if (urlParams["q1"] === 1)
{
return 1;
}
});- 您的示例用法(从准备好的文档返回)似乎很奇怪,而afaics它将永远不会工作:
decode() 将只返回一个字符串,而您的三重等于将其与整数进行比较。否则似乎是一个很好的解决方案。 - …虽然这和安迪的解决方案是一样的。
- 链接已断开。
(P)This will work…你需要召唤这个功能,当你需要得到的参数通过你的名字…(p)字母名称- 这几乎与顶部的regexp答案相同,只是您匹配的是整个URL,而不仅仅是查询字符串部分,并且没有删除结果中的转义。
(P)Do this reliably is more involved than one may think at first.(p)- EDOCX1,which is used in other answers,is Brittle and应当避免――For example,it returns empty if some screwsUp and puts a EDOCX1 theocx1 penographic 12 common identifier before the EDOCX1 penographic 13 string.
- There are a number of ways urls get automatically escaped in theBrowser,which makes EDOCX1 penographic 14 universal pretty much mandatory,in我的意见。
- Many query strings are generatiated from user input,which meansAssumptions about the URL content are very bad.Including very basic有一种感觉,就是说,每一个关键都是独一无二的,甚至有一个价值。
(P)为了解决这一问题,这里是一个配置良好的防预方案投资政策。Note that it can be made half the size if you are willing to hardcode some of the variables,or if the input can never include EDOCX1 silginal 15,etc.(p)(P)版本1:Returns a data object with names and values for each parameter.它的有效性取决于它们和始终尊重从左到右的第一个来源。(p)字母名称(P)版本2:Returns a data map object with two identical length arrays,one for names and one for values,with an index for each parameter.This one supports duplicate names and intentionally does not de-duplicate them,because that is probably why you would want to use this format.(p)字母名称(P)注(p)
- 虽然这里的大多数答案都是将查询部分拆分为参数,而不是从任意URL中提取。其中大多数假设我们在当前页面上,所以只需使用
location.search 获取要提取的字符串。 - 这不是问题的关键,我们需要提取每对查询参数作为键/值、支持数组、空值等。顺便问一下,"?""hello haha"不是一个好的行为,因为haha通常会重新引用一个不构成参数"hello"一部分的锚。
- 我用一个非常简短和模糊的问题来表示一些与其他人所做的完全不同的事情。现在我明白了这是什么意思了,我已经更新了我的答案,包括一个明显更好的设计,这是平等的。
这对我不起作用,我想匹配
?b 作为b 参数存在,而不匹配?return 作为r 参数,这是我的解决方案。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18window.query_param = function(name) {
var param_value, params;
params = location.search.replace(/^\?/, '');
params = _.map(params.split('&'), function(s) {
return s.split('=');
});
param_value = _.select(params, function(s) {
return s.first === name;
})[0];
if (param_value) {
return decodeURIComponent(param_value[1] || '');
} else {
return null;
}
};- 有了这些问题,这里的哪个答案对你不起作用?(这值得对答案本身进行评论,我也有兴趣知道。)至于您的解决方案,它看起来像是使用underline.js的字符串拆分解决方案?你可能错过了给
decodeURIComponent 的电话。 - 不错的捕获,我添加了
decodeURIComponent 和一个规范。最乐观的答案(Jolly为2600分)并不像预期的那样工作:对于未找到的参数不返回null ,也不检测?b ,例如当前参数。
1
2
3
4
5
6
7// Parse query string
var params = {}, queryString = location.hash.substring(1),
regex = /([^&=]+)=([^&]*)/g,
m;
while (m = regex.exec(queryString)) {
params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
}- 呃,散列!=查询字符串。
- 如何从javascript中检索GET参数?
- 关于解析:在JavaScript中解析查询字符串
- 关于javascript:jquery从URL获取查询字符串
- 关于javascript:如何从location.search获取特定参数?
- 如何在Javascript中解析URL查询参数?
- 如何在javascript中获取GET变量的值?
- 关于javascript:使用正则表达式获取所有URL参数
- 关于javascript:jQuery查询字符串
- 关于正则表达式:Javascript正则表达式多重匹配
- 在Javascript中获取查询字符串数组值
- 关于javascript:jquery有"exists"函数吗?
- JavaScript闭包如何工作?
- 关于javascript:如何异步上传文件?
- date:你如何获得JavaScript的时间戳?
- 如何在javascript中将字符串转换为布尔值?
- 关于javascript:如何重定向到另一个网页?
- regex:如何替换JavaScript中出现的所有字符串
- 如何检查JavaScript中的字符串是否包含子字符串?
- 如何从javascript中的数组中删除特定元素?
- 关于javascript:如何从异步调用返回响应?