jQuery$.address()插件:hashbang链接与HTML5状态支持冲突

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

下面是一个描述问题的场景:

用户A有一个支持HTML5状态的浏览器,并将此链接发送给用户B:

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()
    的值(如果站点位于文档根目录,则仅为空字符串)
  • baseUrl
    是URI协议和域,例如
    http://domain.tld
    (无尾随斜杠)
  • 支持\u历史\u api()
    是从