我正在使用document.location.hash来保留页面上的状态,我将url编码的键值对放在那里,用“&”分隔字符。到现在为止还挺好。
然而,我在Firefox上遇到了一个令人讨厌的问题 - Firefox会在路上悄悄地对哈希值进行url-decode,所以当你以后将它解码时它会被解码。
我可以通过检测我在firefox上运行的时间以及在路上的所有两次上调用encodeURIComponent来解决问题,但显然这很可怕,我真的不想这样做。
这是一个简单的例子,我将“=”编码为“%3D”,将其放入哈希值,当我稍后将其删除时,它会自动转回“=”:
// on the way in::
document.location.hash = "foo=" + encodeURIComponent("noisy=input");
//then later.....
// on the way out:
var hash = document.location.hash;
kvPair = hash.split("=");
if (kvPair.length==2) {
console.log("that is correct.")
} else if (kvPair.length==3) {
console.log("oh hai firefox, this is incorrect")
}
我的手指交叉,可能有一些隐藏的DOM元素,firefox创建它代表实际(未解码)的哈希值?
但是底线 - 有没有人遇到过这个并找到了一个更好的解决方案,而不仅仅是浏览器检测并在Firefox上调用encodeURIComponent两次?
注意:我认为其他几个问题具有相同的根本原因。最值得注意的是这一个:
答案 0 :(得分:1)
我强烈建议不要使用哈希值来保存状态。 Hash应该指向object的fragment-id,如RFC 1630
中所述这代表a的一部分,片段或子功能 宾语。 (...)fragment-id遵循它所在的整个对象的URL 用井号(#)分隔。
是否有什么阻止您使用Cookie来保护州? Cookie很简单,可以在JS described on Geko DOM Reference pages中使用,并且可以安静地执行操作,而不会将值附加到永远不会漂亮的URL。
如果您绝对必须使用散列,您可能需要考虑将'='替换为其他字符,例如“:”。
答案 1 :(得分:0)
您可以做的是使用
将“=”更改为其他内容 var string = string2.replace("=", "[$equals]")
你可能需要多次运行这条线,具体取决于有多少“=”。
然后就是你上面的那个过程。
注意如果您需要更多代码,可以在将散列拆分为数组后将[$ equals]替换为“=”。