在传统的网页开发中,网页跳转往往需要通过页面重载来实现。如果我们需要跳转到另一个页面,我们通常会通过超链接或是页面表单来触发页面跳转流程,浏览器会向服务器请求新页面并刷新页面,这种跳转方式常常会带来两个问题:
1.用户体验较差,因为页面需要重新加载,跳转会出现白屏的情况,用户无法流畅地浏览页面。
2.不利于SEO优化,因为搜索引擎在抓取页面时,通常只会抓取静态信息而忽略动态加载的内容。
为了提升用户体验和SEO优化效果,我们可以采用无刷新页面跳转的方式来实现页面跳转。HTML5提供的history.pushstate方法可以实现无刷新页面跳转的效果,同时不会影响到浏览器的前进和后退按钮的功能。
本文将介绍如何使用history.pushstate方法来实现无刷新页面跳转,并为大家提供一些实用的代码示例。
一、history.pushstate方法的基本介绍
HTML5的history对象提供了一系列操作浏览器历史记录的方法和属性,其中最常用的方法就是history.pushstate方法。
history.pushstate方法可以将当前的页面添加到浏览器的历史记录中,同时不会引起页面的刷新,这样我们就可以通过修改浏览器的地址栏来实现页面跳转的效果。该方法有三个参数:
history.pushState(state, title, url);
state:一个JavaScript对象,用于存储当前页面状态的信息,可以在history.state中访问到。
title:新页面的标题,虽然不是必须的参数,但是每次调用该方法都会添加一条历史记录,所以最好还是为新页面设定一个标题。
url:新页面的网址,这个参数是必须的。
二、
需要分为以下几个步骤:
1.捕获浏览器的点击事件,阻止默认跳转行为。
2.使用history.pushstate方法将新页面添加到浏览器的历史记录中。
3.通过ajax请求获取新页面的HTML代码,并使用DOM操作将其插入到当前页面。
下面我们分别介绍这些步骤。
1.捕获浏览器的点击事件
在我们想要实现无刷新页面跳转的超链接或者表单中,需要加入自定义属性来标识该链接或表单的作用,例如:
然后在页面加载完成后,我们需要对所有带有data-link="ajax"属性的链接和表单进行事件绑定:
$("a[data-link='ajax'],form[data-link='ajax']").on("click submit", function(event){
//阻止默认跳转行为
event.preventDefault();
});
这里需要注意,我们使用了jQuery的on方法将click和submit事件绑定到了带有data-link="ajax"属性的链接和表单上,同时也需要阻止默认的跳转行为。
2.使用history.pushstate方法添加新页面到浏览器的历史记录中
$("a[data-link='ajax'],form[data-link='ajax']").on("click submit", function(event){
//阻止默认跳转行为
event.preventDefault();
//获取新页面的地址
var url = $(this).attr("href") || $(this).attr("action");
//修改浏览器地址栏
history.pushState(null, null, url);
});
在上面的代码中,我们首先获取了带有data-link="ajax"属性的链接或表单的地址,然后使用history.pushstate方法将该地址加入到浏览器的历史记录中,这样就可以通过浏览器的前进和后退按钮来切换页面。
需要注意的是,我们使用了null来代替state和title参数,在这种情况下,浏览器会将当前页面的状态和标题视为null或undefined,因此我们需要在加载新页面时,通过ajax请求获取新页面的状态和标题,然后通过history.replacestate方法来修改该历史记录的状态和标题。
3.通过ajax请求获取新页面的HTML代码
$("a[data-link='ajax'],form[data-link='ajax']").on("click submit", function(event){
//阻止默认跳转行为
event.preventDefault();
//获取新页面的地址
var url = $(this).attr("href") || $(this).attr("action");
//修改浏览器地址栏
history.pushState(null, null, url);
//如果新页面没有被访问过,则通过ajax请求获取新页面的HTML代码,并插入到当前页面中
if (!$.data(this, "loaded")) {
$.get(url, function(html){
//获取新页面的状态和标题
var state = {...};
var title = "...";
//修改该历史记录的状态和标题
history.replaceState(state, title, url);
//将新页面插入到DOM中
$('[data-link="ajax"][href="' + url + '"], [data-link="ajax"][action="' + url + '"]').trigger("loaded").each(function(){
var target = $(this).data("target");
if (target) {
$(target).html($(html).find(target).html());
} else {
$("body").html($(html).find("body").html());
}
});
});
}
});
在这段代码中,我们首先使用jQuery的$.get方法来获取新页面的HTML代码,然后通过DOM操作将新页面插入到当前页面中,并且使用history.replacestate方法修改该历史记录的状态和标题。
需要注意的是,如果新页面已经被访问过,那么我们就不需要再次获取HTML代码,并且也不需要更改历史记录的状态和标题,只需要将新页面插入到DOM中就可以了。为了标识新页面是否已经被访问过,我们使用了$.data方法来为每个带有data-link="ajax"属性的链接和表单添加一个loaded属性。
另外,如果新页面只需要显示部分内容,我们可以通过在链接或表单上添加data-target属性来指定需要更新的目标元素。
三、常用的无刷新页面跳转示例
1.基本的无刷新页面跳转
$(function(){
$("a[data-link='ajax']").on("click", function(event){
event.preventDefault();
var url = $(this).attr("href");
history.pushState(null, null, url);
if (!$.data(this, "loaded")) {
$.get(url, function(html){
var state = {...};
var title = "...";
history.replaceState(state, title, url);
$("body").html($(html).find("body").html());
});
}
});
});
2.无刷新页面跳转并更新特定元素