【发布时间】:2013-04-16 08:44:39
【问题描述】:
我用过(https://github.com/browserstate/history.js),有一段这样的代码
History.Adapter.bind(window, 'statechange', function() {
var State = History.getState();
alert('Inside History.Adapter.bind: ' + State.data.myData);
});
function manageHistory(url, data, uniqueId){
var History = window.History;
if ( !History.enabled ) { return false; }
History.replaceState({myData: data}, null, '?stateHistory=' + uniqueId);
}
如果我在我的 ajax 调用之后调用 manageHistory(),那么 History.Adapter.bind 回调方法会被正确调用。但是,如果我向后单击浏览器,然后单击前进按钮,导致页面导航从 B 到 A,然后 A 返回到 B,则不会调用 History.Adapter.bind 内的回调方法。这发生在 chrome 和 IE9 上。任何人都知道如何解决此问题,我需要在单击浏览器后退然后前进后获取State,以更新我的 DOM。请帮忙
注意:我为 html4 浏览器 IE9
使用版本 1.7.1 jquery.history.js更新(2013 年 5 月 3 日):多谈谈我的要求
对不起,我正忙于其他任务,直到现在我有时才需要查看这个问题。所以@ 987654328@ ajax 调用,我把返回给我的信息,并将其推送到状态。我的要求是:如果我从页面 A 导航到页面 B,然后在页面 B 上,我执行导致 DOM 操作的 ajax 请求的数量(让每个导致 DOM 操作的 ajax 请求称为state)。如果我点击后退按钮,我应该回到页面 A,如果我点击前进按钮,我应该回到页面 B,并保持上一次的状态。
所以我的想法是,oncomplete 在我的 ajax 请求中,我会用我当前的状态替换历史中的最后一个状态(我的 json 对象是我从 ajax 请求返回的 html)。如果我使用推送状态,假设我在页面 B,然后单击一个按钮,我的页面现在更改为 aaa,我推送状态 aaa。然后,如果我单击其他按钮,我的页面现在更改为 bbb,我 pushState bbb。如果我现在单击返回按钮,我仍会在页面 B 上,我的状态为 History.Adapter.bind(window, 'statechange', function() {}) 显示为 aaa,如果我再次单击返回按钮,我将转到页面 A。我不希望这种行为。我希望如果我在状态为bbb 的页面B 上,然后单击返回,我将转到页面A,如果我单击前进,我将转到状态为bbb 的页面B。我希望这更有意义。请帮忙
【问题讨论】:
-
re:您的更新 - 我认为您不想使用历史记录来跟踪页面 B/A 中的“状态更改”。仅将历史记录与您的 URL 更改结合使用。单个 url 中的任何状态更改(即 A 与 B)都应通过另一种机制保存状态(而不是通过 history.replaceState(); ... 这对于像 Backbone 或 Angular 这样的 MV* 库来说非常容易。
-
查看 jquery-mobile,他们有一种 ajaxy 方式来处理您可能会觉得有用的页面:jquerymobile.com
标签: javascript jquery browser-history pushstate history.js