43

是否window.location.hash包含 url 部分的编码或解码表示?

当我在 Firefox 3.5 和 Internet Explorer 8 中打开相同的 url(http://localhost/something/#%C3%BC其中%C3%BC翻译为ü)时,我得到不同的值document.location.hash

  • IE8:#%C3%BC
  • FF3.5:

有没有办法在两个浏览器中获得一个变体?

4

4 回答 4

39

不幸的是,这是 Firefox 中的一个错误,因为它location.hash会在访问时解码额外的时间。例如,在 Firefox 中试试这个:

location.hash = "#%30";
location.hash === "#0"; // This is wrong, it should be "#%30"

唯一的跨浏览器解决方案是只使用(location.href.split("#")[1] || "")来获取哈希。设置哈希使用location.hash似乎适用于所有支持的浏览器location.hash

于 2009-11-10T00:15:05.233 回答
6

回答我自己的问题,我目前的解决方案是解析window.location.href而不是使用window.location.hash,因为前者总是(即在每个浏览器中)url 编码。因此,CMSdecodeURIComponent提出的功能始终可以安全使用。YUI也是如此,因此不会错……

于 2009-11-09T23:03:50.570 回答
5

您可以使用decodeURIComponent,它会在所有情况下返回:

decodeURIComponent('#%C3%BC'); // #ü
decodeURIComponent('#ü'); // #ü

在这里试试。

于 2009-11-09T20:37:59.240 回答
0

实际上,在我的 Firefox 版本(Linux 上的 3.5)中,如果我在 URL 中键入“#%C3%BC”作为哈希,则 URL 本身实际上会转换为带有“#ü”的 unicode。但是您似乎已经回答了您自己的问题——在 Firefox 中,浏览器会转换 URL 中的实体转义码,而在 IE 中则不会。

我的建议实际上是这样的:根本不要在 URL 中放置“#%C3%BC”,而只需在您的哈希和 URL 中使用完整的 unicode。这是一个选择吗?它应该在任何现代浏览器中都能正常工作。

于 2009-11-09T20:31:58.387 回答