当前位置: 首页 > news >正文

HTML5 history API实践

一、history API知识点总结

  在HTML4中,我们已经可以使用window.history对象来控制历史记录的跳转,可以使用的方法包括:

复制代码
  history.forward();//在历史记录中前进一步

  history.back();//在历史记录中后退一步

  history.go(n);//在历史记录中跳转n步,n=0则刷新当前页,n=-1则后退一步
复制代码

  在HTML5中,又新增了四个可用的API,包括:

复制代码
history.pushState(data[,title][,url]);//向历史记录中追加一条记录,data是一个js对象,可以是任何格式的json数据,title参数暂时不起作用,我亲自试了也确实如此。参数url是指地址栏中的地址值,不填则保持当前url

history.replaceState(data[,title][,url]);//替换当前页在历史记录中的信息。参数与上面一致。

history.state;//是一个属性,可以得到当前页的state信息。

window.onpopstate;//是一个事件,在点击浏览器后退按钮或js调用forward()、back()、go()时触发。监听函数中可传入一个event对象,event.state即为通过pushState()或replaceState()方法传入的data参数。
复制代码

二、新API在实际中的使用

  知道了有这些新API,我们可以如何利用它们呢?以下是两个相关的使用案例:

  ① 还原ajax程序中浏览器后退按钮的功能。其实这个应用已经被大家广泛熟知了,由于ajax的固有缺点(无法使用浏览器后退按钮返回上一页),通过在发起ajax请求时在历史记录中添加一条记录并修改地址栏中的值,来模拟一个正常的跳转,同时仍然保留ajax异步加载的优点。方法如下:

var title = '另一篇随笔';
var url = 'http://www.cnblogs.com/lvdabao/p/另一篇随笔.html';
var state = {title:title,url:url};
history.pushState(state,title,url);//第三个参数url的值将会出现在地址栏

   点击下面按钮,注意地址栏的变化:

    

  ②保存异步请求的参数,在页面返回时重现原来页面上的动态数据。具体需求是这样的:比如我们处在一个搜索结果列表页,页面上的内容是根据搜索条件动态得到的,我们可以点击其中一项进行详情预览(发ajax请求),在详情页点击“返回”时,我们希望原来的搜索数据还在,而不是变回列表页初始加载时的数据。以前,我们可以用回传参数的方式解决这样的需求,但那样做的缺点就是有大量的数据需要来回传递,如果页面层级较多,将会很不方便。那么现在,我们结合使用history的onpopstate事件,便可用完成这样的功能。举例来说:

  我要做一个介绍HTML5 history的页面,index.html中的代码如下:

复制代码
<body>
<p>HTML5 history API 介绍</p>
<a href="javascript:void(0)" id="pushstate">history.pushState(data, title [, url])</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="javascript:void(0)" id="replacestate">history.replaceState(data, title [, url]) </a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="javascript:void(0)" id="onpopstate">window.onpopstate</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="javascript:void(0)" id="back">返回</a>
<div id="loaddiv"></div>
<script>

$(function(){
    
    var loaddiv = $('#loaddiv');

//点击不同的链接,分别在loaddiv中加载不同的内容
$(
'#pushstate').click(function(){ loaddiv.load('1.php?stype=push'); history.pushState({title:'push',url:'1.php?stype=push'}); }); $('#replacestate').click(function(){ loaddiv.load('1.php?stype=replace'); history.pushState({title:'replace',url:'1.php?stype=replace'}); }); $('#onpopstate').click(function(){ loaddiv.load('1.php?stype=onpop'); history.pushState({title:'onpop',url:'1.php?stype=onpop'}); });

//点击返回,让浏览器后退一步 $(
'#back').click(function(){ history.back(); });
//兼听popstate事件,可以取到e.state的值,其中保存了你调用pushState方法时传入的数据,根据数据中的url异步加载相应内容。便实现了点击返回时页面上的数据保持是上次加载过的。 window.onpopstate
= function(e){ if(e.state){ loaddiv.load(e.state.url); } } }); </script> </body>
复制代码

  我要分别介绍history的三个新特性,通过调用jquery的load方法来异步加载,发送一个请求到1.php,同时传递对应的参数。后台接受到请求后根据不同的参数返回不同的数据,php代码如下:

复制代码
<?php
$type = $_REQUEST['stype'];
switch($type){
    case 'push' :  
    echo 'history.pushState(data, title [, url]):往历史记录堆栈顶部添加一条记录;data会在onpopstate事件触发时作为参数传递过去;title为页面标题,当前所有浏览器都会 忽略此参数;url为页面地址,可选,缺省为';
    break;
    case 'replace' :  
    echo 'history.replaceState(data, title [, url]) :更改当前的历史记录,参数同上';
    break;
    case 'onpop' :  
    echo 'window.onpopstate:响应pushState或replaceState的调用;';
    break;
    }
?>
复制代码

  我在这里无法上传php文件,你可以将代码复制到本地服务器测试。如此一来,便可以实现像github那样的页面加载机制。

  以上便是我所见到过的关于history的两点使用方法。有发现错误欢迎指正,其他观点也欢迎交流。

本文转自吕大豹博客园博客,原文链接:http://www.cnblogs.com/lvdabao/p/3253071.html,如需转载请自行联系原作者

相关文章:

  • 项目中使用RDLC报表
  • Workflow笔记2——状态机工作流
  • Octoroit OS VB操作系统简单介绍
  • 【C#】与C及OC的不同点
  • 10个小技巧帮助Devops走向成功
  • [UVA 11825] Hackers' Crackdown
  • Springboot集成Mybatis
  • 11.32 php扩展模块安装
  • vue跨域解决方法
  • 关于android Activity的 theme
  • HTTP 07 追加协议与 Ajax
  • Javascript 面向对象编程—继承和封装
  • 沃土前端社区教程 - es6(7)常用技能点
  • MATH
  • EXTJS学习系列基础篇:第二篇(转载)作者殷良胜
  • __proto__ 和 prototype的关系
  • angular2 简述
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • JS+CSS实现数字滚动
  • JS基础之数据类型、对象、原型、原型链、继承
  • miaov-React 最佳入门
  • Vue UI框架库开发介绍
  • 后端_ThinkPHP5
  • 删除表内多余的重复数据
  • 深度解析利用ES6进行Promise封装总结
  • 微信小程序:实现悬浮返回和分享按钮
  • 湖北分布式智能数据采集方法有哪些?
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (06)Hive——正则表达式
  • (1)SpringCloud 整合Python
  • (175)FPGA门控时钟技术
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)Linq学习笔记
  • (转)大道至简,职场上做人做事做管理
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .apk文件,IIS不支持下载解决
  • .NET 依赖注入和配置系统
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • [ActionScript][AS3]小小笔记
  • [Android Pro] AndroidX重构和映射
  • [Android] 修改设备访问权限
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [Asp.net mvc]国际化
  • [BZOJ] 2044: 三维导弹拦截
  • [C/C++]数据结构 栈和队列()
  • [C++进阶篇]STL中vector的使用
  • [flask] flask的基本介绍、flask快速搭建项目并运行
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率
  • [HNOI2018]排列