是否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:
#ü
有没有办法在两个浏览器中获得一个变体?
是否window.location.hash
包含 url 部分的编码或解码表示?
当我在 Firefox 3.5 和 Internet Explorer 8 中打开相同的 url(http://localhost/something/#%C3%BC
其中%C3%BC
翻译为ü
)时,我得到不同的值document.location.hash
:
#%C3%BC
#ü
有没有办法在两个浏览器中获得一个变体?
不幸的是,这是 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
。
回答我自己的问题,我目前的解决方案是解析window.location.href
而不是使用window.location.hash
,因为前者总是(即在每个浏览器中)url 编码。因此,CMSdecodeURIComponent
提出的功能始终可以安全使用。YUI也是如此,因此不会错……
您可以使用decodeURIComponent
,它会#ü
在所有情况下返回:
decodeURIComponent('#%C3%BC'); // #ü
decodeURIComponent('#ü'); // #ü
在这里试试。
实际上,在我的 Firefox 版本(Linux 上的 3.5)中,如果我在 URL 中键入“#%C3%BC”作为哈希,则 URL 本身实际上会转换为带有“#ü”的 unicode。但是您似乎已经回答了您自己的问题——在 Firefox 中,浏览器会转换 URL 中的实体转义码,而在 IE 中则不会。
我的建议实际上是这样的:根本不要在 URL 中放置“#%C3%BC”,而只需在您的哈希和 URL 中使用完整的 unicode。这是一个选择吗?它应该在任何现代浏览器中都能正常工作。