每当我执行推送状态时,Statechange就会触发

时间:2012-01-05 14:52:44

标签: javascript jquery browser-history history.js

我正在使用history.js来处理后退按钮。在history.js中,只要我执行pushstate,statechange就会触发。为什么呢?

3 个答案:

答案 0 :(得分:12)

想要添加,是的,这是History.js的预期行为。 同时有more discussions批评这种行为,因为它不是W3C标准,确实造成了一些混乱。

简而言之,回答你的问题:在History.js pushState()函数中,最后调用statechange。

这个解决方案的优点是你可以改变(推送)你的新状态并让onstatechange()函数处理转换。 下行是您无法处理异常/或必须将它们写入onstatechange事件处理程序。

我个人更喜欢W3C的处理方式,因为你可以区分后退/前进按钮和pushState。 History.js维护者正在开发一个内部标记解决方案,使您可以更改此行为:

  

注意上面调用[pushstate-calls]如何触发statechange事件,如果对某些人来说   因为你不希望这种情况发生在你的状态转换中   处理程序,您可以使用以下内容:

if ( History.getState().internal ) { return; }

*此功能目前正在开发中,只能与History.js的'dev'版本一起使用!希望这将有助于未来的其他人:)

答案 1 :(得分:9)

在尝试完成这一天后,我终于找到了解决方案:https://github.com/browserstate/history.js/issues/47#issuecomment-25750285

代码非常简单,下面引用链接:

当你推动你的状态时

History.pushState({
    _index: History.getCurrentIndex(),
    someData: ...
}, someTitle, someUrl);

然后在事件绑定中

History.Adapter.bind(window, 'statechange', function () {
    var currentIndex = History.getCurrentIndex();
    var internal = (History.getState().data._index == (currentIndex - 1));
    if (!internal) {
        // your action
    }
});

答案 2 :(得分:3)

根据这个discussion on github,它是history.js

的预期行为

pull request声称修改了history.js以更符合W3C规范。