我正在使用 document.location.hash 来保存页面上的状态,并且我将 url 编码的键值对放在那里,由“&”字符分隔。到目前为止,一切都很好。
但是我在 Firefox 上遇到了一个恼人的问题——Firefox 会在进入的过程中悄悄地对哈希值进行 url 解码,所以当你稍后取出它时,它已经被解码了。
我可以通过检测何时在 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")
}
我祈祷 firefox 可能创建了一些隐藏的 DOM 元素来表示实际的(未解码的)哈希值?
但归根结底——有没有人遇到这个问题并找到了比在 Firefox 上进行浏览器检测和两次调用 encodeURIComponent 更好的解决方案?
注意:我认为其他几个问题具有相同的根本原因。最值得注意的是这个:
最佳答案
我强烈建议不要使用散列值来保存状态。哈希应该指向对象的片段 ID,如 RFC 1630 中所述。
This represents a part of, fragment of, or a sub-function within, an object. (...) The fragment-id follows the URL of the whole object from which it is separated by a hash sign (#).
有什么东西阻止您使用 cookie 来保存状态吗? Cookie 很简单,可以在 JS 中使用,described on Geko DOM Reference pages , 并且会悄悄地完成这个技巧,而不会向 URL 附加值,这从来都不是很漂亮。
如果您绝对必须使用散列,则可能需要考虑将“=”替换为其他字符,例如“:”。
关于javascript - 有没有办法让 firefox 不自动对分配给 document.location.hash 的值进行 url 解码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5797656/