我正在使用History.js(jquery.history.js v1.8b2)。 Chrome版本30.0.1599.101 m。
我无法弄清楚如何让History.js以我期望的方式工作。
我有一个有两个链接的页面。第一个模拟ajax操作。它只是将页面中<h2>
中的文本从“开始”更改为“2”。第二个链接指向google.com。
这就是我的所作所为:
单击后退按钮时,我希望应该调用statechange处理程序,然后我将获取状态对象,以便将文本恢复为“2”。
但是没有调用处理程序。所以我的页面留下了文本“start”(浏览器中的缓存页面)。有趣的是,url设置为我在pushState调用中推送的“2”版本。
我错过了什么吗?这是我的代码:
<h2 id="state">start</h2>
<a id="2" class="button" href="#">Goto State 2</a>
<a href="http://google.com">Goto google</a>
<script type="text/javascript">
$(function() {
History.Adapter.bind(window, "statechange", function() {
console.log("statechange called");
var state = History.getState();
if (state.data.mystate) {
// Restore the old state
$("#state").text(state.data.mystate);
} else {
// Start state
$("#state").text("start");
}
});
$(".button").click(function(e) {
// push the state we're transitioning to
var newState = $(this).attr("id");
History.pushState(
{ mystate: newState },
"at state " + newState,
"http://localhost:50494/PushState?state=" + newState);
// statechange will be called now, and we'll update the page from our newState
e.preventDefault();
});
});
</script>
答案 0 :(得分:0)
我认为答案是否定的,当从页面外部导航回来时,不应该调用statechange。
我注意到http://browserstate.github.com/history.js/demo/上的演示正如我所期望的那样工作,所以我做了一个视图来源,看看它是如何工作的。据我所知,这是你应该如何使用History.js。
pushState(yourObject,...)
我错误地认为你应该做更新页面的所有工作,然后再推送状态。这只会让事情变得困难,因为状态也会被调用。
此外,通常情况下,您应该在您所在的一个页面中推送类似ajax的转换的状态。不要为你在页面外跟随的链接推送状态(除非你真的了解这一切,并试图做一些奇特的事情)。
我在这里更新了示例代码,以显示现在对我有用的内容:
<h2 id="state">start</h2>
<a id="2" class="button" href="#">Goto State 2</a>
<a href="http://google.com">Goto google</a>
<script type="text/javascript">
$(function () {
// page loading, check for available state I recognize
var availableState = History.getState();
if (!availableState.data.mystate) {
// loading for the first time
$("#state").text("start");
} else {
// load from the available state
loadState(availableState);
}
History.Adapter.bind(window, "statechange", function () {
var state = History.getState();
loadState(state);
});
function loadState(state) {
if (state.data.mystate) {
// update the page to this state
$("#state").text(state.data.mystate);
} else {
// update the page to the initial state
$("#state").text("start");
}
}
$(".button").click(function (e) {
// The user clicked a button, so we want to transition to a new state
// in this page. Push the state we're transitioning to (which we've hidden
// in the id attribute in this example).
var newState = $(this).attr("id");
History.pushState(
{ mystate: newState },
"at state " + newState, // title
"?state=" + newState); // url
// statechange will be called now, and we'll update the page from our newState
e.preventDefault();
});
});
</script>