jQuery$.address()插件:hashbang链接与HTML5状态支持冲突
下面是一个描述问题的场景: 用户A有一个支持HTML5状态的浏览器,并将此链接发送给用户B:jQuery$.address()插件:hashbang链接与HTML5状态支持冲突,jquery,html,history,jquery-address,Jquery,Html,History,Jquery Address,下面是一个描述问题的场景: 用户A有一个支持HTML5状态的浏览器,并将此链接发送给用户B: http://domain.tld/node 使用不支持HTML 5状态的浏览器的用户B导航到另一个节点,并将链接发送回用户a: http://domain.tld/node#!/另一个节点 但是,当用户A单击链接时,将显示/node的内容,而不是/other node 查询显示它正在将“hashbang地址”解释为散列值: > $.address.value() "/node#/anothe
http://domain.tld/node
使用不支持HTML 5状态的浏览器的用户B导航到另一个节点,并将链接发送回用户a:
http://domain.tld/node#!/另一个节点
但是,当用户A单击链接时,将显示/node
的内容,而不是/other node
查询显示它正在将“hashbang地址”解释为散列值:
> $.address.value()
"/node#/another-node"
> $.address.path()
"/node"
> $.address.hash()
"/another-node"
(奇怪的是,“!”是从hashbang中掉下来的。)
通过改变我的实现,可以克服这种模糊性吗
如果在URI中发现hashbang,我可以禁用对历史API的支持,但我不希望这样。我可以通过稍微更改实现来解决这个问题 基本上,我根据浏览器的功能确定地址,对照地址的实际内容进行检查,如果地址不匹配,则使用
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()
是URI协议和域,例如baseUrl
(无尾随斜杠)http://domain.tld
是从支持\u历史\u api()