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

时间:2011-05-25 23:17:41

标签: jquery html5 history jquery-address

以下是描述问题的方案:

用户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的支持,但我宁愿不这样做。

1 个答案:

答案 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
  • 获取的内容有点小