以下是描述问题的方案:
用户A的浏览器支持 HTML5状态,并将此链接发送给用户B:
http://domain.tld/node
用户B使用不带 HTML 5状态支持的浏览器,导航到另一个节点,然后将链接发送回用户A:
http://domain.tld/node#!/another-node
但是当用户A点击该链接时,会显示/node
的内容,而不是/another-node
。
查询Asual's jQuery $.address()
plugin表明它正在将“hashbang地址”解释为哈希值:
> $.address.value()
"/node#/another-node"
> $.address.path()
"/node"
> $.address.hash()
"/another-node"
(奇怪的是,“!”从hashbang中删除。)
通过改变我的实施可以克服这种模糊性吗?
如果在URI中找到hashbang,我可以禁用对历史API的支持,但我宁愿不这样做。
答案 0 :(得分:3)
我能够通过改变我的实现来解决这个问题。
基本上,我根据浏览器的功能确定应该的地址,检查地址实际是什么,如果不匹配,请使用location.replace()
替换地址而不创建新的历史记录条目。
var addressValue = $.address.value(),
initPath = window.location.pathname.replace(stateBasePath, ""),
newLocation = baseUrl +stateBasePath + (supports_history_api() ? "" : "/#!") + (addressValue != "/" ? addressValue : initPath + window.location.search);
if (newLocation != window.location.href) {
window.location.replace(newLocation);
}
此代码应尽快执行 - 在DOM就绪函数之外。
stateBasePath
相当于您用于$.address.state()
的值(如果网站位于文档根目录,则只是一个空字符串)baseUrl
是URI协议和域名,例如http://domain.tld
(没有斜杠)supports_history_api()
从Mark Pilgrim