我想以跨浏览器的方式使用jQuery和AJAX实现导航历史记录。我的方法是使用window.history.pushState
并在不支持/#!/url
的浏览器中回退到哈希网址window.history.pushState
。
例如:
<a href="/home">home</a>
<a href="/about">about</a>
<a href="/contact">contact</a>
在支持window.history.pushState
的浏览器上,点击其中一个链接应更改地址而不将页面刷新到http://domain.com/home,http://domain.com/about等。当浏览器不支持window.history.pushState
时,它应该使用片段标识符,即:http://domain.com/#!/home,http://domain.com/#!/about。
更新:根据此处的反馈,我实施了Ajax SEO(git)
jQuery Address用于HTML5历史记录API,旧浏览器回退到/#!/url
。
答案 0 :(得分:22)
// Assuming the path is retreived and stored in a variable 'path'
if (typeof(window.history.pushState) == 'function') {
window.history.pushState(null, path, path);
} else {
window.location.hash = '#!' + path;
}
答案 1 :(得分:6)
我一直使用的回退哈希网址:
History = History || {};
History.pathname = null;
History.previousHash = null;
History.hashCheckInterval = -1;
History.stack = [];
History.initialize = function () {
if (History.supportsHistoryPushState()) {
History.pathname = document.location.pathname;
$(window).bind("popstate", History.onHistoryChanged);
} else {
History.hashCheckInterval = setInterval(History.onCheckHash, 200);
}
};
History.supportsHistoryPushState = function () {
return ("pushState" in window.history) && window.history.pushState !== null;
};
History.onCheckHash = function () {
if (document.location.hash !== History.previousHash) {
History.navigateToPath(document.location.hash.slice(1));
History.previousHash = document.location.hash;
}
};
History.pushState = function (url) {
if (History.supportsHistoryPushState()) {
window.history.pushState("", "", url);
} else {
History.previousHash = url;
document.location.hash = url;
}
History.stack.push(url);
};
History.onHistoryChanged = function (event) {
if (History.supportsHistoryPushState()) {
if(History.pathname != document.location.pathname){
History.pathname = null;
History.navigateToPath(document.location.pathname);
}
}
};
History.navigateToPath = function(pathname) {
History.pushState(pathname);
// DO SOME HANDLING OF YOUR PATH HERE
};
您可以使用以下命令将点击事件绑定到:
$(function(){
$("a").click(function(){
var href = $(this).attr('href');
History.navigateToPath( href )
return false;
});
});
如果你需要更多关于这个例子的解释,我会很高兴听到它。
修改强>
请参阅我的其他答案。
答案 2 :(得分:4)
我的original answer已经有一段时间了,我现在建议使用Backbone。
实施可能是:
// First setup a router which will be the responder for URL changes:
var AppRouter = Backbone.Router.extend({
routes: {
"*path": "load_content"
},
load_content: function(path){
$('#content').load('/' + path);
}
});
var appRouter = new AppRouter;
// Then initialize Backbone's history
Backbone.history.start({pushState: true});
摘自文件:
要表明您希望在应用中使用HTML5
pushState
支持,请使用Backbone.history.start({pushState: true})
。如果您想使用pushState
,但是不支持它的浏览器本身使用完整页面刷新,则可以将{hashChange: false}
添加到选项中。
现在每次调用Backbone.history.navigate
时,AppRouter
都会对#content
div中的路径执行AJAX加载。
要处理与AJAX的所有链接,您可以使用以下内容:
$("a").on('click', function(event){
event.preventDefault();
Backbone.history.navigate( event.currentTarget.pathname, {trigger: true} )
});
记下{trigger: true}
导致路由器中的处理程序被调用(否则只能从URL更改)。