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