每当我执行推送状态时,状态更改就会启动
Statechange is firing whenever i do a push-state
我正在使用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规范。
- 我的jQuery插件参数没有正确启动,遇到了问题
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- 事件和状态
- 从控制器返回后Ajax启动事件激发
- Youtube API - 某些视频卡在未启动 (-1) 状态
- Sencha Touch和Cordova应用程序在设备上运行时卡在启动状态
- 按钮启动为活动状态
- 鼠标在全屏+指针锁定状态下按下任何键时都不会启动
- 检测浏览器窗口是否处于活动状态,并在窗口再次处于活动状态后启动事件[JavaScript]
- React:在设置状态之前启动初始渲染(通过ajax)
- 如何仅在启动选项卡处于活动状态时加载启动选项卡内容
- 嵌套状态(角度ui)的父作用域未启动
- 每当我执行推送状态时,状态更改就会启动
- 当我的angularjs应用程序启动时,有没有办法防止加载初始状态
- 如何用JavaScript停止(悬停子,父悬停状态启动)
- 如何让ui-router总是在给定的状态下启动
- 启动按钮加载状态
- Jquery灯光开关设置启动状态
- 如果子控制器处于相同状态,则angular ui路由器-嵌套控制器-父控制器将启动两次
- Angular Ionic UI-Router - 如何确保在嵌套状态下启动应用程序时加载所有父视图