有没有一种无需插件的方式,可以通过jQuery(或者不使用jQuery)来获取查询字符串的值?
如果有,该如何实现?如果没有,是否有插件可以实现这个功能?
有没有一种无需插件的方式,可以通过jQuery(或者不使用jQuery)来获取查询字符串的值?
如果有,该如何实现?如果没有,是否有插件可以实现这个功能?
http://someurl.com?key=value&keynovalue&keyemptyvalue=&&keynovalue=nowhasvalue#somehash
?param=value
)?param
:没有等号或值)?param=
:有等号,但等号右边没有值)?param=1¶m=2
)?&&
:没有键或值)###代码:
-
var 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]);
}
}
-
params['key']; // returns an array of values (1..n)
###输出:
-
key ["value"]
keyemptyvalue [""]
keynovalue [undefined, "nowhasvalue"]
function 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];
}
}
}
taken from here
pair[1]
之前,您可能至少希望调用decodeUriComponent
对其进行解码,如果没有像其他解决方案一样先将加号替换为空格。其他一些解决方案还倾向于在拆分=
时设置2个部分的限制,以更宽容地接受输入。 - Ruphttps://github.com/Nijikokun/query-js
用法
获取特定参数/键:
query.get('param');
使用builder获取整个对象:
var storage = query.build();
console.log(storage.param);
还有更多...请查看 GitHub 链接以获得更多示例。
特性
#hello?page=3
user[]="jim"&user[]="bob"
&&
name&hello="world"
param=1¶m=2
4kb
获取查询的单行代码:
var value = location.search.match(new RegExp(key + "=(.*?)($|\&)", "i"))[1];
(location.search.match(new RegExp('kiosk_modeasdf' + "=(.*?)($|\&)", "i")) || [])[1]
。该代码的作用是检索 URL 中名为"kiosk_modeasdf"的参数值,如果该参数不存在,则返回undefined。 - Brad Kochvar value = location.search.match(new RegExp("hello" + "=(.*?)($|\&)", "i"))[1];
将返回 "world"
。 - tim它以jquery.*为“前缀”,但解析函数本身不使用jQuery。它非常快,但仍可进行简单的性能优化。
此外,它还支持URL中列表和哈希表的编码,例如:
arr[]=10&arr[]=20&arr[]=100
或者hash[key1]=hello&hash[key2]=moto&a=How%20are%20you
jQuery.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;
}
我更倾向于使用split()
而不是正则表达式进行此操作:
function 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;
}
var 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
alert(request.q)
return
语句,而且我认为在读取这两个pair[]
值时需要对它们进行decodeUriComponent
解码。 - Rup这是我正在使用的内容:
/**
* 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: https://dev59.com/nHNA5IYBdhLWcg3wmfAa#23946023
*/
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中运行。
paramName
在技术上也需要进行decodeURIComponent
,尽管我怀疑任何人都不会使用非平凡的参数。) - Rup对于想要一种简短方法(但有限制)的人:
location.search.split('myParameter=')[1]
获取所有查询字符串参数,包括复选框的值(数组)。
考虑到GET参数的正确和正常使用,我发现大多数函数缺少对数组的支持以及删除哈希数据。
因此,我编写了以下函数:
function 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-- 循环,性能应该非常好。
支持:
注意:
不支持对象数组(key[key]=value)
如果空格是 +,它将保留为 +。
如果需要,请添加 .replace(/\+/g, " ")
。
用法:
qs('array[]=1&array[]=2&key=value&empty=&empty2#hash')
返回:
{
"empty": "",
"key": "value",
"array": [
"1",
"2"
]
}
演示:
信息
如果您不理解某些内容或无法阅读该函数,请询问。我很乐意解释我在这里做了什么。
如果您认为该函数不可读性和可维护性差,我可以为您重写该函数,但请考虑使用简写和位运算符始终比标准语法更快(也许阅读 ECMA-262 书中的简写和位运算符,或使用您喜欢的搜索引擎)。将代码重写为标准易读的语法会导致性能损失。
location.search
开头,其中不包含它。我也不清楚您所说的“位运算符”是什么意思-您在几个地方使用了空或未定义为false,这是最接近的,但这里没有位操作。 - Rup