11

有谁知道确定是否可以使用 pushState 的库?

我正在使用这个:

if(window.history.pushState){
    window.history.pushState(null, document.title, path);
}else{
    location.pathname = path;
}

但我刚刚发现 Safari 5.0.2 中存在一个错误,即使上述测试通过,它也无法工作:http: //support.github.com/discussions/site/2263-line-links-broken

我在想可能还有其他问题,有人可能已经找到了它们并将它们包裹起来,但我还没有找到任何东西。

编辑: @Crescent Fresh

从我所看到的看来,pushState 似乎推送到历史堆栈并更改了 url,但没有更新 location.pathname。在我的代码中,我使用 setInterval 来检查路径是否已更新。

var cachedPathname = location.pathname;
if(window.history.pushState){
    cachedPathname = location.pathname;
    setInterval(function(){
        if(cachedPathname !== location.pathname){
            cachedPathname = location.pathname;
            //do stuff
        }
    }, 100);
}

在 Safari 5.0.2 中,当 pushState 更改 url 时 location.pathname 不会更改。这适用于其他浏览器和 Safari 版本。

4

2 回答 2

24

查看 Modernizer 源代码,这是它检查推送状态的方式:

  tests['history'] = function() {
      return !!(window.history && history.pushState);
  };

所以对你来说一个简单的方法就是:

var hasPushstate = !!(window.history && history.pushState);

window.history在深入两层之前,必须首先检查是否存在,这可能就是您遇到错误的原因。

于 2012-05-18T05:56:54.780 回答
16

pushState 是HTML5 History API的一部分。您可以使用常规 JavaScript 测试支持,如下所示:

if (typeof history.pushState !== "undefined") {
    // pushState is supported!
}

或者,您可以使用Modernizr库:

if (Modernizr.history) {
     // pushState is supported!
}
于 2011-11-01T05:23:01.247 回答