【问题标题】:Is there a way to get firefox to not automatically url-decode values assigned to document.location.hash?有没有办法让firefox不自动对分配给document.location.hash的值进行url解码?
【发布时间】:2011-04-26 23:31:49
【问题描述】:

我正在使用 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")
}

我很高兴,可能有一些隐藏的 DOM 元素是由 firefox 创建的,它代表了实际的(未解码的)哈希值?

但底线——有没有人遇到过这种情况并找到了比仅在 Firefox 上进行浏览器检测和两次调用 encodeURIComponent 更好的解决方案?

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

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

【问题讨论】:

  • 恐怕没有比 Firefox 中的不同程序更好的方法了,直到有一天他们修复了这个错误:bugzilla.mozilla.org/show_bug.cgi?id=483304。一个选项可能是使用字符串函数从 window.location 提取哈希。

标签: javascript url encoding


【解决方案1】:

我强烈建议不要使用哈希值来保存状态。哈希应该指向对象的片段 ID,如 RFC 1630 中所述

这表示一个部分、片段或其中的一个子功能, 目的。 (...) fragment-id 跟随它所在的整个对象的 URL 用井号 (#) 分隔。

有什么阻止您使用 cookie 来保存状态吗? Cookie 很简单,可以在 JS 中使用 described on Geko DOM Reference pages,并且会悄悄地完成任务,而不会将值附加到永远不漂亮的 URL。

如果您绝对必须使用哈希,您可能需要考虑将 '=' 替换为其他字符,例如“:”。

【讨论】:

  • 我和作者有同样的问题。当您需要传播共享 url 的状态时,使用 cookie 不是解决方案。还有其他跨浏览器兼容的解决方案吗?理想情况下,我们会有 html5 onpopstate。
  • 我们这里有解决方案stackoverflow.com/questions/4835784/…
【解决方案2】:

你可以做的就是将“=”更改为其他使用

var string = string2.replace("=", "[$equals]")

您可能需要多次运行上面的行,具体取决于有多少个“=”。

然后你有和上面一样的过程。

NB 如果您需要它以获取更多代码,您可以在将哈希拆分为数组后将 [$equals] 替换回“=”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 2018-02-08
    • 2010-11-06
    • 2014-11-24
    • 2010-12-17
    • 1970-01-01
    相关资源
    最近更新 更多