Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ajax无刷新页面切换,历史记录后退前进解决方案 #218

Open
confidence68 opened this issue Sep 21, 2016 · 0 comments
Open

ajax无刷新页面切换,历史记录后退前进解决方案 #218

confidence68 opened this issue Sep 21, 2016 · 0 comments

Comments

@confidence68
Copy link
Owner

问题描述

我们在工作中常常遇到需要用ajax来显示下一页和上一页,ajax无刷新页面,因此,假如你想通过浏览器的历史记录返回上一页和下一页。那这就问题来了!一般需求要历史返回的时候,我们通常不使用ajax。但是呢,假如一个页面中,只有一个地方是动态的,其他地方都是固定的,除了使用模板之外,那么就是使用ajax来操作显得格外方便!那么如何解决ajax历史记录的返回和前进呢?今天我们就一起来学习一下!

js中history相关API普及

首先我们来看看history相关的API。

history.state

当前URL下对应的状态信息。如果当前URL不是通过pushState或者replaceState产生的,那么history.state是null。

history.pushState(state, title, url)

将当前URL和history.state加入到history中,并用新的state和URL替换当前。不会造成页面刷新。

state:与要跳转到的URL对应的状态信息。

title:页面的题目,假如没有就穿空字符串就可以。

url:要跳转到的URL地址,不能跨域。

history.replaceState

用新的state和URL替换当前。不会造成页面刷新。

state:与要跳转到的URL对应的状态信息。

title:页面的题目,假如没有就穿空字符串就可以。

url:要跳转到的URL地址,不能跨域。

window.onpopstate

history.go和history.back(包括用户按浏览器历史前进后退按钮)触发,并且页面无刷的时候(由于使用pushState修改了history)会触发popstate事件,事件发生时浏览器会从history中取出URL和对应的state对象替换当前的URL和history.state。通过event.state也可以获取history.state。

支持性判断

if ('pushState' in history) {...}

相关代码

假如我们动态的html代码id是haorooms。

定义如下函数

function processAjaxData(obj, url){
     document.getElementById("haorooms").innerHTML = obj.html;
     document.title = obj.pageTitle;
     window.history.pushState({"html":obj.html,"pageTitle":obj.pageTitle},"", url);
 }

obj是后台ajax返回来的数据,obj.html来替换动态haorooms下面的内容,页面标题是返回的pageTitle标题。

而当有浏览者点击浏览器“后退”或“前进”按钮时,我们用下面的代码来响应用户的操作:

window.onpopstate = function(event){
    if(event.state){
        document.getElementById("haorooms").innerHTML = event.state.html;
        document.title = event.state.pageTitle;
    }
};

兼容性

谷歌浏览器,火狐浏览器,Safafi浏览器、IE10+等现代浏览器都支持这种技术。假如你感兴趣,可以试试!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant