我正在使用HTML5历史记录API与ajax加载内容进行尝试。
我有许多通过相对链接连接的测试页面。 我有这个JS,它处理那些链接上的点击。 当单击链接时,处理程序获取其href属性并将其传递给ajaxLoadPage(),该函数会将请求页面的内容加载到当前页面的内容区域中。(如果您以正常方式请求PHP页面,则设置为返回完整的HTML页面,但如果在请求URL后附加?fragment=true,则仅返回一部分内容。)
然后我的单击处理程序调用history.pushState()来显示地址栏中的URL并将其添加到浏览器历史记录中。
$(document).ready(function(){
var content = $('#content');
var ajaxLoadPage = function (url) {
console.log('Loading ' + url + ' fragment');
content.load(url + '?fragment=true');
}
// Handle click event of all links with href not starting with http, https or #
$('a').not('[href^=http], [href^=https], [href^=#]').on('click', function(e){
e.preventDefault();
var href = $(this).attr('href');
ajaxLoadPage(href);
history.pushState({page:href}, null, href);
});
// This mostly works - only problem is when popstate happens and state is null
// e.g. when we try to go back to the initial page we loaded normally
$(window).bind('popstate', function(event){
console.log('Popstate');
var state = event.originalEvent.state;
console.log(state);
if (state !== null) {
if (state.page !== undefined) {
ajaxLoadPage(state.page);
}
}
});
});
当您使用pushState将URL添加到历史记录中时,还需要包含popstate事件的事件处理程序以处理单击“后退”或“前进”按钮。(如果不这样做,单击“后退”会在地址栏中显示您推送到历史记录中的URL,但页面不会更新。)因此,我的popstate处理程序获取我创建的每个条目的状态属性中保存的URL,并将其传递给ajaxLoadPage以加载相应的内容。
对于由我的单击处理程序添加到历史记录中的页面,这种方法可以正常工作。但是,当我以“正常”方式请求它们时,浏览器添加到历史记录中的页面会发生什么情况呢?比如说我通过点击那个ajax加载的链接在第一个页面上着陆然后在我的网站上导航 - 如果我尝试通过历史记录回到那个第一个页面,则最后一个单击会显示第一个页面的URL,但不会在浏览器中加载该页面。为什么会这样呢?
我有点明白这与最后一个popstate事件的状态属性有关,该属性为null,因为只有由pushState()或replaceState()添加到历史记录中的条目才能给它赋值。但是,我第一次加载页面是以“正常”请求的方式进行的 - 为什么浏览器不能简单地后退并以正常方式加载初始URL呢?