2

这是描述问题的场景:

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

http://domain.tld/node

使用不支持 HTML 5 状态的浏览器的用户 B导航到另一个节点,并将链接发送回用户 A:

http://domain.tld/node#!/another-node

但是当用户 A 单击链接时,显示的内容为 ,/node而不是/another-node

查询Asual 的 jQuery$.address()插件显示它正在将“hashbang 地址”解释为哈希值:

> $.address.value()
  "/node#/another-node"
> $.address.path()
  "/node"
> $.address.hash()
  "/another-node"

(奇怪的是,“!”是从 hashbang 中删除的。)

可以通过更改我的实现来克服这种歧义吗?

如果在 URI 中找到 hashbang,我可以禁用对历史 API 的支持,但我宁愿不这样做。

4

1 回答 1

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的小曲
于 2011-07-20T21:11:58.217 回答