可以使用pushState

时间:2011-02-11 06:04:49

标签: javascript pushstate

是否有人知道确定是否可以使用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版本。

2 个答案:

答案 0 :(得分:24)

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

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

所以,一个简单的方法就是:

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

必须先检查window.history是否存在才能进入两个级别,这可能是您遇到错误的原因。

答案 1 :(得分:16)

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

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

或者,您可以使用Modernizr库:

if (Modernizr.history) {
     // pushState is supported!
}