采用AJAX + history api做无刷新页面的分页

大家都知道浏览器有一个history对象是用来保存浏览历史的,比如一个窗口访问了两个个页面,那么history.length属性等于2.

history api在H5时代新增了两个方法,pushState和replaceState

从名字就可以知道一个是新增一条记录一个是改变当前那么记录。

用AJAX加history做分页的好处就是既提高了用户体验,支持前进后退,加快页面加载速度又对搜索引擎十分友好

首先我们来判断浏览器是否支持pushState/replaceState

if(!!(windows.history && history.pushState)){
   //支持
}else{
   //不支持
}

接着我们要给当前页面添加一个State,添加之前先了解一下这两个新方法

pushState和replaceState一样有三个参数

state: 一个与指定网址相关的状态对象,popstate事件触发时,该对象会传入回调函数。如果不需要这个对象,此处可以填null。

title:页面的标题,但是目前所有浏览器都忽略这个值,因此这里可以填null/false

url:新的网址,为了防止恶意代码此处必须与当前页面处在同一个域。浏览器的地址栏将显示这个网址。

replaceState与pushState不同的地方在于前是修改后者是新增。

那么现在就给页面添加一个State:

history.pushState({page:"page_2.html"},"page 2","page_2.html"}

执行这个操作后,浏览器URL会变成 www.website.com/page_2.html,但并不会进行跳转,甚至不会对这个地址进行检查是否存在。

于此同时我们通过ajax加载页面内容,代码如下

$(‘a‘).on("click",function(e){
    if(!!(windows.history && history.pushState)){
        e.preventDefault()
        history.pushState({page:"page_2.html"},"page 2","page_2.html"}
        ajax(page)  //ajax代码就省略了,无非是局部加载内容
    }else{
        //不支持此方法
    }
})

这样我们就完成了点击分页后添加state和加载页面内容

那当用户点击前进/后退,我们该怎么办?

这时候就要用到popstate事件。

当用户点击前进/后退或在javascript中调用history.back/forward/go时就会触发popstate事件

$(window).on("popstate",function(){
    ajax(page)
})

这是还要特别注意一下,在webkit浏览器中(最新的chrome已经改正这个问题,大概是chrome 20版本之前会有这个问题,Safari的高版本没测),第一次加载页面也会触发popstate事件,所以我们也要对第一次加载进行判断

$(window).on("popstate",function(e){
    var first_onload = (e.originalEvent.State == null)
    if(first_onload){
        return false;
    }
    ajax(page)
})

由于我们对第一次加载添加了state等于null的判断,所以我们必须在第一次加载改变state,否则当用户后退到第一个页面时state又等于null,ajax就不会执行,页面内容也无法更新了

history.replaceState({{page:"page_1.html"},"page 1","page_1.html")

这样一来,整个代码就完成了,完整代码如下

function Pagination(){
    $(‘a‘).on("click",function(e){
        if(!!(windows.history && history.pushState)){
            e.preventDefault()
            var page_url = $(this).attr("page_url")//获取page信息,根据你的需要而变
            history.pushState({page: page_url},false,page_url)
            ajax(page_url)  //ajax代码就省略了,无非是局部加载内容
        }else{
            //不支持此方法
        }
    })
    
    $(window).on("popstate",function(e){
        var first_onload = (e.originalEvent.State == null)
        if(first_onload){
            history.replaceState({page: window.location.href},page: document.title,page: window.location.href) //给第一次加载改变state,也可以写到函数的最后
            return false;
        }
        var page_url = $(this).attr("page_url")//获取page信息,根据你的需要而变
        ajax(page_url)
    })
}
时间: 2024-12-21 17:07:25

采用AJAX + history api做无刷新页面的分页的相关文章

利用HTML5的History API实现无刷新跳转页面初探

HTML4中的History API history这个东西大家应该都不陌生,我们经常使用history.back(-1)来实现后退功能,具体的属性和方法如下: 属性 length 历史的项数.JavaScript 所能管到的历史被限制在用浏览器的“前进”“后退”键可以去到的范围.本属性返回的是“前进”和“后退”两个按键之下包含的地址数的和. 方法 back() 后退,跟按下“后退”键是等效的. forward() 前进,跟按下“前进”键是等效的. go() 用法:history.go(x):在

JSF中使用f:ajax标签无刷新页面改变数据

ajax本是用在前端的一种异步请求数据的操作,广泛用于js中,一般的js框架如jq都有被封装好的方法,用于发起异步请求操作.异步操作可以增强用户体验和操作,越来越多的程序都在使用ajax.JSF的facelets内置了一个ajax标签,可用于简单的ajax操作. f:ajax 有几个常用属性,分别是:event.listener.render. 1.event:event 对应一个js事件名,该事件名省略了开头的”on“字符,例如点击事件是onclick,那么只需要填入click即可.类似事件还

ASP.NET—015:ASP.NET中无刷新页面实现

原文作者:杨友山 原文地址:http://blog.csdn.net/yysyangyangyangshan/article/details/39679823 前面也说过在asp.net中前后前交互的问题.使用了ajax.js的方法:$.post和$.ajax. http://blog.csdn.net/yysyangyangyangshan/article/details/22755007和http://blog.csdn.net/yysyangyangyangshan/article/det

ASP.net中的AJAX学习记录六 无刷新的数据编辑(GridView和DetailsView结合实例)(转)

本篇博客是仿照书中实例,实现GridView和DetailsView结合无刷新的数据编辑效果,页面效果:当点击GridView1的行或换页时,都会引发DetailsView1的数据绑定显示至页面,同时当使用DetailsView1编辑.删除.添加时,也会引起GridView1的重新绑定,整体页面实现无刷新. 页面布局: 1.新建AJAX窗口,命名为:"NoRefreshEdit.aspx".要想实现页面无刷新编辑,就必须使用两个Updatepanel. 2.在NoRefreshEdit

ajax+FormData+javascript实现无刷新表单信息提交

ajax+FormData+javascript实现无刷新表单信息提交 原理: dom收集表单信息,利用FormData快速收集表单信息  ,实例化表单数据对象 同时收集fm的表单域信息. var fd = new FormData(fm); //实例化对象 alert(fd); fd对象内部有收集的form表单域信息 ajax传递表单信息 1.静态显示页面代码 1 <!DOCTYPE html > 2 <html> 3 <head> 4 <meta http-e

ajax+FormData+javascript 实现无刷新上传附件

<!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> <script type="text/javascript"> window.onload=function() { var fm=document.getElementsByTagName("form")[0]; f

ajax+FormData+javascript 实现无刷新表单注册

<!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> <script type="text/javascript"> window.onload=function() { var fm=document.getElementsByTagName("form")[0]; f

ASP.NET ashx实现无刷新页面生成验证码

现在大部分网站登陆时都会要求输入验证码,在网上也看了一些范例,现在总结一下如何实现无刷新页面生成验证码. 效果图: 实现方式: 前台: 1 <div> 2 <span>Identifying Code:</span> 3 <asp:TextBox ID="txtValidationCode" runat="server" Width="130px" MaxLength="4">&

form 无刷新页面提交表单

表单可实现无刷新页面提交,无需页面跳转,如下: 通过一个隐藏的iframe实现, form表单的target设置为iframe的name名称,form提交目标位当前页面iframe则不会刷新页面 <form action="/url.do" method="post" target="targetIfr"> <input type="text" name="name"/> </