我在JavaScript中解析URL编码的查询字符串参数时遇到了一个奇怪的问题。
function getUrlVars() {
var vars = [], hash;
alert(window.location.href);
var hashes = window.location.href.slice(decodeURIComponent(window.location.href).indexOf('?') + 1).split('&');
alert(decodeURIComponent(window.location.href));
for (var i = 0; i < hashes.length; i++) {
hash = hashes[i].split('=');
vars.push(hash[0]);
vars[hash[0]] = hash[1];
}
return vars;
}
网址:here
值"DZj9aEoyZ2I="
是base64 URL编码值,但它无法正确解析;它忽略了"%3d"
。请建议一个解决方案?
答案 0 :(得分:0)
仅在解压缩后对值进行解码;
function getUrlVars() {
var vars = {}, hash; url = 'http://domain/approveFile/ApproveFile.aspx?id=DZj9aEoyZ2I%3d';
var hashes = url.slice(url.indexOf('?') + 1).split('&');
for (var i = 0; i < hashes.length; i++) {
hash = hashes[i].split('=');
vars[hash[0]] = decodeURIComponent(hash[1]);
}
return vars;
}
这会为您提供Object {id: "DZj9aEoyZ2I="}
。
答案 1 :(得分:0)
您在分割=
之前解码部分,这意味着%3d
被视为键值分隔符,最终以{{1}结尾在循环内部。这似乎是不受欢迎的行为,因此在所有hash[2]
之后修复为decodeURIComponent
尝试实施.split
作为列表功能,类似于您在 php 中找到的内容,为繁荣发布..
foo[]
在网址上使用搜索function getUrlVars() {
var $_GET = Object.create(null), // for..in safe
pairs = window.location.search.slice(1).split('&'),
pair,
i;
for (i = 0; i < pairs.length; ++i) {
pair = pairs[i].split('=');
if (pair[0].slice(-2) === '[]') {
pair[0] = pair[0].slice(0, -2);
pair[0] = decodeURIComponent(pair[0]);
if (pair[1]) pair[1] = decodeURIComponent(pair[1]); // don't assume this
if (!(pair[0] in $_GET))
$_GET[pair[0]] = [];
else if (!Array.isArray($_GET[pair[0]]))
$_GET[pair[0]] = [$_GET[pair[0]]];
$_GET[pair[0]].push(pair[1]);
} else {
pair[0] = decodeURIComponent(pair[0]);
if (pair[1]) pair[1] = decodeURIComponent(pair[1]); // don't assume this
$_GET[pair[0]] = pair[1];
}
}
return $_GET;
}
将提供
?foo=bar%3d&baz[]=fizz&baz[]=buzz
答案 2 :(得分:0)
如今,如果您使用的是ES6:
const getUrlParams = (search) => {
let hashes = search.slice(search.indexOf('?') + 1).split('&')
let params = {}
hashes.map(hash => {
let [key, val] = hash.split('=')
params[key] = decodeURIComponent(val)
})
return params
}
console.log(getUrlParams(window.location.search))