有没有办法让firefox不自动url-decode分配给document.location.hash的值?

时间:2011-04-26 23:31:49

标签: javascript url encoding

我正在使用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两次?

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

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

2 个答案:

答案 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]替换为“=”。