javascript - 有没有办法让 firefox 不自动对分配给 document.location.hash 的值进行 url 解码?

标签 javascript url encoding

我正在使用 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 更好的解决方案?

注意:我认为其他几个问题具有相同的根本原因。最值得注意的是这个:

https://stackoverflow.com/questions/4834609/malformed-uri-in-firefox-not-ie-using-encodeuricomponenet-and-setting-hash

最佳答案

我强烈建议不要使用散列值来保存状态。哈希应该指向对象的片段 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/

相关文章:

java - 传递到 URI 的参数无效

javascript - 如何使用 React 中的 JSON 文件中的每个值生成组件?

javascript - 防止 .lastChild 返回回车?

javascript - 理解 React props 和 key

java - 从链接获取 youtube id

linux - 扫描可用的 WiFi 网络会产生奇怪的字符 (Raspbian)

php - 如何验证用户为 mb_*() 函数提供的字符集字符串?

javascript - 试图理解javascript事件循环: Why do effects occur simultaneously?

url - NSURL 快速获取资源值

javascript - 使单页博客与搜索引擎一起工作