每当我执行推送状态时,状态更改就会启动

Statechange is firing whenever i do a push-state

本文关键字:状态 启动 执行      更新时间:2023-09-26

我正在使用history.js来处理返回按钮。在history.js中,每当我执行pushstate时,就会触发状态更改。为什么?

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

简而言之,为了回答您的问题:在History.js中,pushState()函数是对末尾的statechange的调用。

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

我个人更喜欢W3C处理这一问题的方式,因为您可以区分后退/前进按钮和pushState。History.js的维护人员正在开发一个内部标志解决方案,使您能够改变这种行为:

注意上面的调用[pushstate calls]是如何触发状态更改事件的,如果你不希望这种情况发生的原因,然后在你的州内改变您可以使用以下处理程序:

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

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

经过一天的努力,我终于在这里找到了解决方案: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
    }
});

根据github上的讨论,history.js 的预期行为

这个pull请求声称已经修改了history.js,使其更符合W3C规范。