HTML5 修改浏览器url而不刷新页面

嘛,起因是黑子大叔在微博上的一条@信息,找起了这个的实现,看了一圈google的中文信息内似乎还没有怎么提到这个的内容,就发表上来。

详细效果就是类似于用Firefox4+/Chrome 5+/Safari 5+/Opera 11.5+登录新浪微博后看到的个人时间轴,在翻页时可以观察到这个效果,地址栏URL变动,但是页面没有刷新,用firebug观察也观察不到刷新整个页面,只有ajax请求的翻页数据。从先前的理解来说,URL的修改必然引起(请注意我不是在说通过锚点修改)浏览器重载页面,但利用HTML5新加入的history.pushState();history.replaceState();可以完全自己维护一个历史记录列表绕开历史记录完全由浏览器控制的机制,从而实现比锚点更加完美的一种页内更新的体验。

代码方面很简单,只要在需要修改url的地方插入一行:

window.history.pushState({"html":response.html,"pageTitle":response.pageTitle}, ‘title‘, urlPath);
//三个参数,分别为:状态对象,标题(目前被浏览器忽略),地址

即可在历史记录里面产生一个新的历史记录(另一个replaceState方法参数完全相同,只是替代掉当前的状态)。
在体验上,非常接近于使用锚点(window.location = “#foo”;),但是mozilla的文档提出了以下三点好处:

  • 新的URL可以是和原始页面URL同域下的任何URL,如果用锚点,只能更新#后面的部分
  • 仅在需要时更新URL,锚点的历史记录在相同时不会创建(即当前已经是”#foo”的情况下,如果再将当前页面锚点设置为”#foo”,不会产生新的历史记录)
  • 可以记录下任意类型的数据,使用锚点的话将要自己维护一份历史数据列表或者把数据转码到一个字符串里

(翻译&描述的有点别扭,见笑了,不过其实应该自己也能体会到这些好处才是)

我自己实现的一个例子:
http://vifix.cn/atelier/demos/html5-update-browser-url-without-reloading-page

代码:

<?php
if(!isset($_REQUEST[‘page‘])){
	$page = 1;
}
else{
	$page = intval($_REQUEST[‘page‘]);
}
 
if(isset($_REQUEST[‘ajaxload‘])){
	echo "第{$page}页的内容";
	die;
}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>HTML5 修改浏览器url而不刷新页面</title>
<script type="text/javascript">
var domLoaded = function(){
	if(ua != null && ua[1] < 10){
		alert(‘您的浏览器不支持‘);
		return ;
	}
 
	if(location.href.indexOf("?") > -1){
		var urlparts = location.href.match(/(.+?)\?.+/i);
		var urlbase = urlparts[1];
	}
	else{
		var urlbase = location.href;
	}
	var page = <?php echo $page;?>;
	var ua = window.navigator.userAgent.match(/msie (\d\.\d)/i);
	var content = document.getElementById("content");
	var loading = document.getElementById("loading");
 
	window.history.replaceState(
		{
			content:content.innerHTML,
			page:page
		},
		page,
		urlbase + (page > 1 ? ‘?page=‘ + page : ‘‘ )
	);
 
	var ajax = new XMLHttpRequest();
	var ajaxCallback = function(){
		if(ajax.readyState == 4){
			loading.style.display = ‘none‘;
			content.innerHTML = ajax.responseText;
			window.history.pushState(
				{
					content:content.innerHTML,
					page:page
				},
				page,
				urlbase + "?page=" + page
			);
			next.href = urlbase + "?page=" + (page + 1);
		}
	};
 
	var next = document.getElementById(‘next‘);
	var nextClickEvent = function(event){
		if(loading.style.display != ‘block‘){
			loading.style.display = ‘block‘;
			page++;
			ajax.open(‘GET‘, urlbase + ‘?page=‘ + page + ‘&ajaxload=on‘, true);
			ajax.onreadystatechange = ajaxCallback;
			ajax.send(‘‘);
			event.preventDefault();
		}
	};
	next.addEventListener(‘click‘, nextClickEvent, false);
 
	var popstate = function(){
		content.innerHTML = history.state.content;
		page = history.state.page;
	};
	window.addEventListener(‘popstate‘, popstate, false);
};
 
try{
	window.addEventListener(‘DOMContentLoaded‘, domLoaded, false);
}
catch(e){
	alert(‘您的浏览器不支持‘);
}
</script>
</head>
<body>
	<p id="content">
		<?php echo "第{$page}页的内容";?>
	</p>
	<p>
		<a id="next" href="?page=<?php echo $page+1;?>">下一页</a>
	</p>
	<div id="loading" style="display:none;">
		加载中
	</div>
</body>
</html>

mozilla的文档
https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history

stackoverflow上的相关问题:
http://stackoverflow.com/questions/3338642/updating-address-bar-with-new-url-without-hash-or-reloading-the-page
http://stackoverflow.com/questions/824349/modify-the-url-without-reloading-the-page

http://vifix.cn/blog/html5-modify-browser-url-without-reloading-page.html

时间: 2024-10-10 13:47:39

HTML5 修改浏览器url而不刷新页面的相关文章

使用JavaScript修改浏览器URL地址栏的实现代码

源自http://www.jb51.net/article/42240.htm 现在的浏览器里,有一个十分有趣的功能,你可以在不刷新页面的情况下修改浏览器URL;在浏览过程中.你可以将浏览历史储存起来,当你在浏览器点击后退按钮的时候,你可以冲浏览历史上获得回退的信息,这听起来并不复杂,是可以实现的,我们来编写些代码.来看看它是如何工作的. <script type="text/javascript"> function justUrlChange(){ for(i=0;i&

vue,vue-router实现浏览器返回不刷新页面

当我们在写单页应用的时候,前端路由采用vue-router实现,如果从页面A跳到页面B,然后点浏览器返回,返回到页面A时,页面会刷新.最近遇到一个需求,一个列表页,用户会根据条件进行筛选,也可以翻页,当用户筛选后点击具体的某一个条目时,进入详情页查看编辑详情,用户点击返回时,希望之前页面的筛选条件也能够保留.查找相关资料,vue中有个keep-alive组件可以对组件进行缓存,这样当页面返回时就不会刷新页面. <keep-alive> <router-view></route

HTML5 History对象,Javascript修改地址栏而不刷新页面(二)

一.实例说明: $('#btnOne').click(function () { var stateObject = { id: 1 }; var title = "本地首页"; var newUrl = '/index.html'; //修改地址栏中的地址 /* * 使用说明,pushState中缓存的地址,必须是当前域中的地址 */ history.pushState(stateObject, title, newUrl); }); $('#btnTwo').click(funct

解决微信浏览器无法使用reload()刷新页面

场景是这样子的,页面在初始化时有一个ajax请求,在页面上有一个按钮,点击的时候执行window.location.reload(),正常情况reload()后页面依然会向后台发出请求,但在安卓的微信浏览器中reoad后请求的一直是第一次打开页面时请求的数据.可以理解为请求被缓存了,但没有实测,也不知道是否是缓存. 解决方法是,使用window.location.href="window.location.href+随机数" 代替 window.location.reload().切记

javascript:window.location.replace 与 window.location.reload() 刷新页面的不同效果

今天早上我发现一个问题,当一个网页的地址最后面是一个#时(比如:http://www.baidu.com/go.asp#), 执行:window.location.replace(window.location.href); 浏览器不刷新页面. 经过测试: window.location.href = window.location.href; 浏览器也不刷新页面. 经过测试:window.location.reload() ; 浏览器会刷新页面. 以前经过一些测试发现 window.locat

HTML5: History API 无刷新更改地址栏

HTML5 新增的历史记录 API 可以实现无刷新更改地址栏链接,配合 AJAX 可以做到无刷新跳转. 简单来说:假设当前页面为renfei.org/,那么执行下面的 JavaScript 语句: window.history.pushState(null, null, "/profile/"); 之后,地址栏的地址就会变成renfei.org/profile/,但同时浏览器不会刷新页面,甚至不会检测目标页面是否存在. 应用:全站 AJAX,并使浏览器能够抓取 AJAX 页面 这个可以

js刷新页面和跳转

javascript返回上一页: 1.返回上一页 history.go(-1); 返回上两个页面 history.go(-2); <a href="javascript:history.go(-1);">上一页</a> 2.history.back(). 3.window.history.forward() 返回下一页 4.window.history.go(返回第几页,也可以是url) 5.window.location.href=url; js刷新页面的几种

WebStorm10.0.4 Live Edit与Google浏览器实时无刷新自动加载页面

[1]打开webstorm→Ctrl + Alt + S→在搜索框输入:live edit,并且进行如下设置,设置完成点击右下角“OK”按钮: [2]在Google浏览器中安装 JetBrains IDE Suport 扩展程序,具体为: http://jingyan.baidu.com/article/bad08e1eef45fa09c85121c2.html [3]在WebStorm中,点击“选中”你需要在浏览器中实现实时刷新的页面(例如,我需要在浏览器中实时刷新gallery.html页面

L--怎样让用户点击浏览器后退按钮刷新后退页面的验证码

介绍 项目需要,怎样让用户点击浏览器后退按钮刷新后退页面的验证码,通过cookie来解决 方法一(通过设置前台html)(失败) 本想通过控制html的http-equiv属性来解决问题,如下 http-equiv属性 1.<meta http-equiv="Content-Type" contect="text/html";charset=gb_2312-80"> 和 <meta http-equiv="Content-Lan