HTML5新特性展示利用history.replaceState()修改历史记录

上一篇文章中介绍history.pushState()的时候,我们提到location.hash存在的3个问题。第一个问题:url会发生改变,这个很容易理解。现在我们看下第二个问题和第三个问题,即如何修改浏览器的历史记录,如何让历史记录存储更多状态相关的信息。状态相关的信息上一篇博客其实已经很容易看出来了,history.pushState()的第一个参数是javascript对象,我们当然可以在这个对象中存放任何我们想要的数据。本文我们主要看一下,如何利用histroy.replaceState修改浏览数的历史记录。

还是上一篇文章中的例子,假如我们要实现这样的功能:在当前页面显示这个页面被访问的次数。很显然通过浏览器的前进和后退按钮,我们可以无限多次地访问某个页面。但是我们并不希望产生更多的历史记录,因为我在A页面和B页面之前跳过来跳过去,说白了就是2个历史记录,只不过页面信息有变化而已。通过pushState和location.hash是无法达到这个要求的,因为这2种方式都是产生新的历史记录,无法修改已有的历史记录。这个时候replaceState就排上用场了。

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<script type="text/javascript" src="jquery-1.11.1.min.js"></script>
	<script type="text/javascript">		

		var currentPageIndex = 0;

		window.onload = function(){
			currentPageIndex = 0;
			showPageAtIndex(currentPageIndex,1);
			addHistory(currentPageIndex);
		}

		// onpopstate可以监控state变化
		window.onpopstate = function(e){
			if(history.state)
			{
				var state = history.state;
				var count = 1 + state.visitTime;
				showPageAtIndex(state.id,count);

				// 修改当前状态信息(修改历史记录)
				history.replaceState({"id":state.id,"visitTime":count},"","");
			}
		}

		function toNextPageWhenClick()
		{
			currentPageIndex++;

			if(isValidPageIndex(currentPageIndex))
			{
				showPageAtIndex(currentPageIndex, 1);
				addHistory(currentPageIndex);
			}
			else
			{
				return;
			}
		}

		function showPageAtIndex(id,count)
		{
			$("div[id!="+id+"]").hide();
			$("#"+id).show();

			if(isHomePage(id))
			{
				$("input").attr("value","current is home page,next page=1");
			}
			else if(isLastPage(id))
			{
				$("input").attr("value","current page="+id+", it is the end.");
			}
			else
			{
				$("input").attr("value","current page="+id+",next page="+(id+1));
			}

			$("#"+id).find("span").text(count);
		}

		function isValidPageIndex(id)
		{
			return id <= 5;
		}

		function isLastPage(id)
		{
			return id == 5;
		}

		function isHomePage(id)
		{
			return id == 0;
		}

		// 增加历史记录
		function addHistory(id)
		{
			history.pushState({"id":id,"visitTime":1},"","");
		}
	</script>

	<style>
		.navigate{
			height:100px;
			width:300px;
			background-color:#0000ff;
			display:none;
		}

		.home{
			height:100px;
			width:300px;
			background-color:#00ff00;
			display:none;
		}

		.last{
			height:100px;
			width:300px;
			background-color:#ff0000;
			display:none;
		}
	</style>
</head>
<body>
	<input type="button" value="" onclick="toNextPageWhenClick();">

	<div class="home" id="0">HOME PAGE.this is <span></span> time to visit this page.</div>
	<div class="navigate" id="1">ajax1.this is <span></span> time to visit this page.</div>
	<div class="navigate" id="2">ajax2.this is <span></span> time to visit this page.</div>
	<div class="navigate" id="3">ajax3.this is <span></span> time to visit this page.</div>
	<div class="navigate" id="4">ajax4.this is <span></span> time to visit this page.</div>
	<div class="last" id="5">last page.this is <span></span> time to visit this page.</div>
</body>
</html>

在onpopstate事件处理函数中,我们拿到了当前历史记录的状态信息,之后再用replaceState修改状态信息。就这样,我们修改了状态信息(修改了历史记录),但是并没有产生新的记录。这是用pushState和location.hash无法实现的。

时间: 2024-07-31 18:49:10

HTML5新特性展示利用history.replaceState()修改历史记录的相关文章

HTML5新特性新增功能

HTML5 现如今已经不是SGML的子集,主要是关于图像,位置,存储,多任务等功能的增加. 如:绘图canvas:用于媒介回放的video和audio元素:本地存储localStorage;语义化元素:表单控件等等新增的功能,都是HTML5新特性. 下面列举HTML5新特性详细说明: 一.新的文档类型  (New Doctype) 目前许多网页还在使用XHTML 1.0 并且要在第一行像这样声明文档类型: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1

HTML5新特性,老生常谈——前端面试常见问题

找工作面试的时候有公司技术人员会问html5新特性,那这里就再复习一遍 1.新的文档类型 <!DOCTYPE html> 2.脚本和链接无需type <link href="css/bootstrap.css" rel="stylesheet"> <script src="js/Angular.js"></script> 3.语义化的Header 和Footer 这里通俗说下什么叫做语义化,就是:明

HTML5新特性data_*自定义属性使用

HTML5 新特性data_*自定义属性使用HTML5规范里增加了一个自定义data属性. 这个自定义data属性的用法非常的简单,就是你可以往 HTML 标签上添加任意以 "data-"开头的属性, 这些属性页面上是不显示的,它不会影响到你的页面布局和风格,但它却是可读可写的. 使用 data-* 可以解决自定义属性混乱无管理的现状.

HTML5 & CSS3初学者指南(3) – HTML5新特性

介绍 本文介绍了 HTML5 的一些新特性.主要包含以下几个方面: Web 存储 地理位置 拖放 服务器发送事件 Web存储 HTML5 Web 存储的设计与构想是一个更好的机制来存储客户端的网络数据.它是通过一个网络浏览器作为客户端数据库实现的,它允许网页以键值对的形式来存储数据. 它具有以下特征: 每个原始网站/域最多可存储 5MB 的数据. 你可以通过属性和方法来使用 JavaScript 操作 web 存储器中的数据实现访问. 就像 cookies,你可以选择将保持数据(维持),即使你已

Html5新特性 &lt;canvas&gt;画板画直线

 下面例子为用canvas标签画多条直线 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht

Html5新特性 &amp;lt;canvas&amp;gt;画板画直线

 以下样例为用canvas标签画多条直线 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht

HTML5新特性有哪些

HTML5新特性有哪些: 1.新的文档类型 2.脚本和链接无需 3.语义Header和Footer The Semantic Header and Footer 4.Hgroup 10.Autofocus 属性 Autofocus Attribute 12.Video 支持 Video Support 13.视频预载 Preload attribute in Videos element 14.显示控制条 15.正规表达式 5.标记元素 6.图形元素 8.占位符 9.必要属性

HTML5新特性小结

HTML5 新特性 新的DocType: <!DOCTYPE html> 不需要声明文档类型: 脚本和链接不需要type属性,如 lingk, script; 语义化标签,如:header, footer, hgroup, mark, figure, small, article, 属性及校验, 新的属性,如:placeholder, required, autofocus, pattern, autocomplete, data, contenteditable 自动校验,如: requir

HTML5新特性--svg-echarts(重点)-拖动API-WebWorker

一.html5新特性--svg--(折线/渐变特效对象/滤镜) #折线:多个坐标点组件一条折线 <polyline points="50,50 70,55 60,66 " stroke="" stroke-width=""> </polyline> #points 一组坐标点 #渐变特效对象:一种特效样式(从一种颜色慢慢过滤另一种颜色效果) #渐变特效对象:(1)创建渐变对象 <defs> (2)在指定图形应用