// 因只需获取1次,所以由立即执行函数获取,并支持多选:多选格式=[{k:二维键名,v:数据},...]
const GET = (function () {
let r = {}
// 获取请求数据,但因键名中可能存在'&',所以此时还不能转码
, a = location.search.substring(1).split('&')
, i = 0, j = a.length, k, v
for (; i < j; i++) {
k = a[i].indexOf('=')
// 转码
if (k === -1) {
v = ''
k = decodeURIComponent(a[i])
} else {
v = decodeURIComponent(a[i].substring(k + 1))
k = decodeURIComponent(a[i].substring(0, k))
}
// 多选判断
let k1 = k.indexOf('['), k2 = k1 === -1 ? -1 : k.indexOf(']', k1 + 1)
if (k2 === -1) r[k] = v
else {// 是多选时
k = k.substring(0, k1)// 1维键名
// 添加到对象数组中
if (typeof r[k] !== 'object') r[k] = []
r[k].push({ k: k.substring(k1 + 1, k2), v: v })
}
}
return r
})();
根据url规则,需要特别注意的地方:
- url的传参部分,包含特殊字符会自动转码,所以后期必须解码
- 特殊字符包含:&?=# 等,所以不能在分离等号前进行解码
- name为空时,即是后面有等号,也不会上传此数据
- name名重复时,只会获取最后的那一个数据
- 手动书写url时,?作为name时不用转码,但=和&作为name时必须转码。(由此可见,规范命名name的重要性)