使用这个简单的javascript代码分析location.hash:
<script type="text/javascript">alert(location.hash);</script>
我很难分离出包含&amp;的GET变量。 (编号为%26)和&amp;用来分隔变量。
示例一:
示例二:
正如您所看到的,示例1没有问题,但让javascript知道示例二中的“code = php&amp; code”超出了我的能力:
(注意:我并没有真正使用这些变量名称,只要搜索词与搜索键不匹配,将其更改为其他名称只会起作用,所以我不认为这是一个有效的解决方案。)
答案 0 :(得分:4)
%26和&amp;之间没有区别在片段标识符('hash')中。 '&amp;'只是在URI的查询('搜索')段中具有特殊含义的保留字符。将'&amp;'转换为'%26'不需要提供应用程序级别的可见性,而不是将'a'转换为'%61'。
由于没有用于在片段标识符中隐藏结构化数据的标准编码方案,您可以创建自己的。例如,使用'+ XX'十六进制编码对组件中的字符进行编码:
hxxp://www.example.com/page#code=php+20+2B+20php&age=15d
function encodeHashComponent(x) {
return encodeURIComponent(x).split('%').join('+');
}
function decodeHashComponent(x) {
return decodeURIComponent(x.split('+').join('%'));
}
function getHashParameters() {
var parts= location.hash.substring(1).split('&');
var pars= {};
for (var i= parts.length; i-->0;) {
var kv= parts[i].split('=');
var k= kv[0];
var v= kv.slice(1).join('=');
pars[decodeHashComponent(k)]= decodeHashComponent(v);
}
return pars;
}
答案 1 :(得分:1)
在Firefox 3.1上进行测试,看起来浏览器在填充location.hash变量时将十六进制代码转换为相应的字符,因此JavaScript无法知道原始字符是单个字符还是十六进制代码。< / p>
如果您正在尝试对像&amp;这样的字符进行编码在哈希变量中,我建议用另一个字符串替换它。
你也可以用奇怪的方式解析字符串,比如(JS 1.6 here):
function pairs(xs) {
return xs.length > 1 ? [[xs[0], xs[1]]].concat(pairs(xs.slice(2))) : []
}
function union(xss) {
return xss.length == 0 ? [] : xss[0].concat(union(xss.slice(1)));
}
function splitOnLast(s, sub) {
return s.indexOf(sub) == -1 ? [s] :
[s.substr(0, s.lastIndexOf(sub)),
s.substr(s.lastIndexOf(sub) + sub.length)];
}
function objFromPairs(ps) {
var o = {};
for (var i = 0; i < ps.length; i++) {
o[ps[i][0]] = ps[i][1];
}
return o;
}
function parseHash(hash) {
return objFromPairs(
pairs(
union(
location.hash
.substr(1)
.split("=")
.map(
function (s) splitOnLast(s, '&')))))
}
>>> location.hash
"#code=php & code&age=15d"
>>> parseHash(location.hash)
{ "code": "php & code", "age": "15d" }
答案 2 :(得分:0)
就像你对第一个例子做的那样,但是在对&amp;然后调用 unescape()将%26转换为&amp;和%20到空格。
编辑:
看起来我有点过时了你现在应该使用 decodeURIComponent(),虽然我没有看到任何关于它对 unescape有什么不同的明确解释( ),除了建议它不能正确处理Unicode。
答案 3 :(得分:0)
这对我来说很好:
var hash = [];
if (location.hash) {
hash = location.href.split('#')[1].split('&');
}