HTML5之pushstate、popstate操作history,无刷新改变当前url

news/2024/7/7 15:03:00

原文: http://www.cnblogs.com/sniper007/p/3536157.html

一、认识window.history

window.history 表示window对象的历史记录,是由用户主动产生,并且接受javascript脚本控制的全局对象。window对象通过 history 对象提供对览器历史记录的访问能力。它暴露了一些非常有用的方法和属性,让你在历史记录中自由前进和后退。

1、历史记录的前进和后退

在历史记录中后退,可以这么做:

1 window.history.back();

这就像用户点击浏览器的后退按钮一样。

类似的,你可以前进,就像在浏览器中点击前进按钮,像这样:

1 window.history.forward();

2、移动到指定历史记录点

通过指定一个相对于当前页面位置的数值,你可以使用go()方法从当前会话的历史记录中加载页面(当前页面位置索引值为0,上一页就是-1,下一页为1)。

要后退一页(相当于调用back()):

1 window.history.go(-1);

向前移动一页(相当于调用forward()):

1 window.history.go(1);

类似的,传递参数“2”,你就可以向前移动2个记录点。你可以查看length属性值,了解历史记录栈中一共有多少个记录点:

1 window.history.length;

二、修改历史记录点

HTML5的新API扩展了window.history,使历史记录点更加开放了。可以存储当前历史记录点、替换当前历史记录点、监听历史记录点,下面逐一简要说明一下。

1、存储当前历史记录点

存储的方式类似于数组的入栈( Array.push() ),在window.history里新增一个历史记录点,例如:

1 // 当前的url为:http://qianduanblog.com/index.html
2 var json={time:new Date().getTime()}; 3 // @状态对象:记录历史记录点的额外对象,可以为空 4 // @页面标题:目前所有浏览器都不支持 5 // @可选的url:浏览器不会检查url是否存在,只改变url,url必须同域,不能跨域 6 window.history.pushState(json,"","http://qianduanblog.com/post-1.html");

执行了pushState方法后,页面的url地址为http://qianduanblog.com/post-1.html。

2、替换当前历史记录点

window.history.replaceState 和 window.history.pushState 类似,不同之处在于 replaceState 不会在 window.history 里新增历史记录点,其效果类似于 window.location.replace(url) ,都是不会在历史记录点里新增一个记录点的。当你为了响应用户的某些操作,而要更新当前历史记录条目的状态对象或URL时,使用 replaceState() 方法会特别合适。

3、监听历史记录点

监听历史记录点,直观的可认为是监听URL的变化,但会忽略URL的hash部分,监听URL的hash部分,HTML5有新的API为 onhashchange ,我的博客里也有说到该方法和跨浏览器的兼容解决方案。可以通过 window.onpopstate 来监听url的变化,并且可以获取存储在该历史记录点的状态对象,也就是上文说到的json对象,如:

 1 // 当前的url为:http://qianduanblog.com/post-1.html
 2 window.onpopstate=function() 3 { 4 // 获得存储在该历史记录点的json对象 5 var json=window.history.state; 6 // 点击一次回退到:http://qianduanblog.com/index.html 7 // 获得的json为null 8 // 再点击一次前进到:http://qianduanblog.com/post-1.html 9 // 获得json为{time:1369647895656} 10 }

值得注意的是:javascript脚本执行 window.history.pushState 和 window.history.replaceState 不会触发 onpopstate 事件。

还有一点注意的是,谷歌浏览器和火狐浏览器在页面第一次打开的反应是不同的,谷歌浏览器奇怪的是回触发 onpopstate 事件,而火狐浏览器则不会

转载于:https://www.cnblogs.com/historymemory/p/6393539.html


http://www.niftyadmin.cn/n/3157425.html

相关文章

用oc写爬虫之HTMLParser

最近刚好有一些小需求,就尝试用OC来写一些简单的爬虫抓取网页上的数据; 发现了一个非常好用的HTMLParser工具 ; 语法是OC的,通过分析网页结构:可以很轻松的抓取需要的数据; 但是提前需要了解html标记语言,了…

[log4j]使用log4j扩展包的RollingFileAppender生成带时间戳的日志文件

使用log4j扩展包的RollingFileAppender生成带时间戳的日志文件 博客分类: Java log4jApacheXMLHTML DailyRollingFileAppender生成的文件是不带时间戳的,必须在某个时间点后,才对原来文件加上时间戳进行重命名。 比如时间戳精确到小时&…

浅谈FTP和SFTP的区别

一、适用场景 我们平时习惯了使用ftp来上传下载文件,尤其是很多Linux环境下,我们一般都会通过第三方的SSH工具连接到Linux,但是当我们需要传输文件到Linux服务器当中,很多人习惯用ftp来传输,其实Linux默认是不提供ftp的…

《Docker生产环境实践指南》——1.2 从开发环境到生产环境

本节书摘来自异步社区《Docker生产环境实践指南》一书中的第1章,第1.2节,作者: 【美】Joe Johnston(乔•约翰斯顿)著,更多章节内容可以访问云栖社区“异步社区”公众号查看 1.2 从开发环境到生产环境 本书着…

SFTP是什么?与FTP之间有什么区别

什么是SFTP? SFTP是一种安全的文件传输协议,一种通过网络传输文件的安全方法;它确保使用私有和安全的数据流来安全地传输数据。 SFTP要求客户端用户必须由服务器进行身份验证,并且数据传输必须通过安全通道(SSH&…

ORACLE-行转列

CreateTime--2017年6月1日16:17:56Author:Marydon 行转列的两种方法 参考链接: http://www.2cto.com/database/201501/367164.html   http://www.oracle-developer.net/display.php?id506 示例一: 测试数据源 第一步:建表 CREATE TABLE DE…

Hibernate 集成 Ehcache 开启二级缓存

一、将 Ehcache.xml 放到 classpath 下 <?xml version"1.0" encoding"UTF-8"?> <ehcache><!--磁盘存储&#xff1a;用来指定缓存在磁盘上的存储目录。可以使用JavaVM环境变量(user.home, user.dir, java.io.tmpdir)--><diskStore p…

7-07. PAT排名汇总(25) (结构体 ZJU_PAT)

题目链接&#xff1a;http://www.patest.cn/contests/ds/7-07 编程能力測试&#xff08;Programming Ability Test&#xff0c;简称PAT&#xff09;是浙江大学计算机科学与技术学院主办的专业技术认证考试&#xff08;网址http://pat.zju.edu.cn/&#xff09;。每次考试会在若干…