选项 1:location.hash
更容易,但没有那么健壮。值得一看,但如果你想存储多个元素的状态,你可能需要选项 2。
这是下面代码的演示。
例子:
function onHashChange() {
var hash = window.location.hash;
// Load the appropriate content based on the hash.
}
$(window).on('hashchange', onHashChange);
$(document).on('load', onHashChange);
$('#button').click(function(){
window.location.hash = "home";
});
这样,您需要做的就是更改按钮更改的哈希值并使用hashchange
事件处理页面加载。
选项 2:使用 History.js 的历史 API
实现起来有点困难(但并不多!),但更加健壮。依赖于广泛使用的框架。
另一种可能更简洁的方法是使用 History API。它允许您在window.location
不刷新页面的情况下进行更改,允许您使用 JavaScript 处理这些更改。
虽然并非所有浏览器都支持该 API,但您可以使用History.jslocation.hash
,它在需要时提供回退。这是一个演示。
来自 History.js 的 github 页面:
History.js在所有浏览器中优雅地支持 HTML5 History/State API(pushState、replaceState、onPopState)。包括对数据、标题、replaceState 的持续支持。支持 jQuery、MooTools 和 Prototype。对于 HTML5 浏览器,这意味着您可以直接修改 URL,而无需再使用哈希。对于 HTML4 浏览器,它将恢复使用旧的 onhashchange 功能。
History.js 的示例:
function onStateChange() {
var state = window.History.getState();
// Handle state accordingly.
// Fetch the data passed with pushState.
var data = state.data;
var title = state.title;
var url = state.url;
}
// Check the initial state.
$('document').on('load', onStateChange);
// Listen for state changes.
window.History.Adapter.bind(window, 'statechange', onStateChange);
// Any data you want to be passed with the state change.
var stateObj = { variable : 'value' }
// Change state using pushState()
window.History.pushState(stateObj, "State name", "/page.html");
大多数浏览器都会忽略状态名称。第三个参数是添加到 URL 的位。