大家在浏览Facebook的相册时有没有发现,页面局部刷新的同时地址栏的地址也改变了,而且不是hash的方式。它使用的就是HTML5 history新增的几个API,作为window的一个全局变量,在HTML4的时代history已不是什么新鲜的事物了。我们经常使用的就有history.back()以及history.go() 。
下面我们来了解下history都有哪些改变。
1. HTML4时代的history API
A) history.length:当前历史列表中的历史记录数(我大概测了下,IE6+是从0开始的,其他的是从1开始的,若有误请反馈哈,^_^);
B) history.go(n):前进或后退n条记录,当n=0或空时会刷新当前页;
C) history.back():后退一步;
D) history.forward():前进一步;
2. HTML5新增的API
A) history.pushState(data, title [, url]):往历史记录堆栈顶部添加一条记录;data会在onpopstate事件触发时作为参数传递过去;title为页面标题,当前所有浏览器都会忽略此参数;url为页面地址,可选,缺省为当前页地址;
B) history.replaceState(data, title [, url]) :更改当前的历史记录,参数同上;
C) history.state:用于存储以上方法的data数据,不同浏览器的读写权限不一样;
D) window.onpopstate:响应pushState或replaceState的调用;
有了这几个新的API,针对支持的浏览器,我们可以构建用户体验更好的应用了。就像刚提到的Facebook相册,虽然是AJAX的方式,但用户可以直接复制页面地址分享给好友,好友打开看到的就是AJAX加载的数据,做到了书签化。当然这里面需要做的工作远不是说的这么简单。
3. 浏览器的兼容性&检测
在HTML5支持不一的时代,新的API总会存在或这或那的兼容性问题。因此我们有必要了解新接口在不同浏览器下的兼容性。
截图来自:《Manipulating the browser history》
如何检测浏览器是否支持History API?
function supports_history_api() {
return !!(window.history && history.pushState);
}
如何检测history.state的兼容性呢?我尝试赋值history.state=1,但history.state在不同浏览器下的读写权限不一样,所以我们换种方式:
var originalHistoryState = history.state; // 保存原有的历史信息
history.replaceState(1, null); // 替换当前历史信息
var stateSupport = history.state == 1; // 是否存储到刚设置的历史信息
history.replaceState(originalHistoryState, null); // 恢复原来的历史信息
4. 安全性
我们看一个例子:DEMO页面在tenpay.com的域名下,用户点击“付款”链接尝试加载另一个域名的某张图片。
可以看到,当我们尝试改变当前地址为一个协议不同、(子)域名不同的地址时,会触发相应的错误。新API在安全性方面作了考虑,所以还是安全的。
5. AJAX Bookmark – AJAX书签化
有了新API的支持,我们可以针对不同浏览器作一些差异化的用户体验。尤其是在AJAX盛行的年代,无历史记录已经是一大诟病。
为了解决AJAX的书签化问题,我们需要解决的主要是以下2个问题:
1. 浏览器对新的HTML5 History API的支持不一;
2. 不支持的浏览器我们如何解决前进/后退的问题 ;
对于问题1,我们采用的是hash方案,这也是很多方案采用的办法了;主要原理这里不细说了,大家可以搜索一下。
下面是我写的解决方案;大家可以参考下,欢迎互相探讨。
github地址:https://github.com/zawaliang/History
6. 一些参考文档
分享到:
相关推荐
HTML5的History API是现代前端开发中的一个重要特性,它极大地改进了浏览器的历史管理,使得开发者可以更加灵活地控制用户在浏览器中的浏览历史记录。在"前端项目-html5-history-api.zip"这个压缩包中,我们看到的...
connect-history-api-fallback, 返回到使用 HTML 5历史记录API的应用程序的回退到 index.html connect-history-api-fallback通过指定索引页面向代理请求请求中间件,这对于使用HTML5历史API的单页应用程序。...
这款"html5参考手册 api.zip_Html5API"压缩包提供了一份详尽的HTML5 API开发手册,即使在没有互联网连接的情况下也能供开发者参考使用。这份手册以.chm( Compiled HTML Help)格式存储,是一种由微软开发的帮助文件...
**Node.js历史服务器详解——基于HTML5 History API的单页应用解决方案** 在现代Web开发中,单页应用程序(Single Page Application, SPA)已经成为一种主流架构,它提供了更流畅的用户体验和更快的页面加载速度。...
Ajax与HTML5 History API实践 Ajax与HTML5 History API的结合可以实现页面的无刷新操作,优点是页面不需要刷新,但缺点是无法前进与后退。HTML5的History API提供了pushState和replaceState两个方法,可以解决这个...
"HistoryAPI:滚动恢复...总结来说,"HistoryAPI:滚动恢复"的Polyfill是为了确保在所有浏览器中都能实现HTML5 History API的滚动恢复功能。通过理解和应用这个Polyfill,开发者可以提高其Web应用的兼容性和用户体验。
HTML5的History API是Web开发中的一个重要特性,它极大地扩展了对浏览器历史记录的控制,使得开发者能够在不刷新页面的情况下改变URL和管理历史记录。在本文中,我们将深入理解History API,尤其是`history.push...
可以完全按照例如Dive Into HTML5书( )或History API规范( )中的描述使用该库 )。 您可以使用以下命令安装此插件: npm install html5-history-api 浏览器支持: history.js -IE8 +和其他浏览器 history....
这个"html5中文api"资源是一个专为中文用户设计的学习工具,包含了HTML5的开发手册,以CHM(Compiled Help Manual)格式提供,这是一种常见的Windows帮助文档格式。 HTML5的API(Application Programming Interface...
10. **History管理和PushState**:HTML5的History API允许开发者改变浏览器的URL而不进行页面刷新,通过PushState和ReplaceState方法可以创建更友好的单页应用体验。 这个“最新Html5中文API”CHM文件很可能是包含...
以上只是HTML5 API的一部分,实际文档中还包含了其他如拖放API、离线应用缓存、History API、Mutation Observers等众多特性。开发者可以根据需求,通过这份中文版的HTML5 API文档,深入学习并熟练掌握这些工具,提升...
尽管也存在一些,但由于您只能使用本机HTML5 History API,因此它们相对较小。 如果您打算支持旧版浏览器,那么可以使用History.js。 该通知位于此处,因为History.js没有获得足够的资金来维护,因此它仅在旧版...
系列文章主要是学习Html5相关的知识点,以学习API知识点为入口,由浅入深的引入实例,让大家一步一步的体会"h5"能够做什么,以及在实际项目中如何去合理的运用达到使用自如,完美驾驭O(∩_∩)O~,
9. **History API**:History API可以管理用户的浏览历史,支持前进、后退等操作,增强了Web应用的导航功能。 #### 三、使用HTML5构建WebApp程序 本书通过丰富的示例和实践项目,指导读者如何利用HTML5的新特性来...
HistoryLocation是包装 HTML5 历史 API。 // ececute http://example.com/ import { HashLocation } from 'common-history' ; const hashLocation = new HashLocation ( ) ; // It is executed each time the ...
HTML5是现代网页开发的核心标准,它极大地扩展了HTML4的能力,引入了许多新的元素、属性、API和功能,旨在提供更丰富的用户体验和更强的交互性。这份“最全html5精华版官方API中文手册”正是为了帮助开发者深入理解...
HTML5的History API是现代Web开发中一个重要的进步,它允许开发者在不重新加载整个页面的情况下改变浏览器的历史记录和URL,从而实现平滑的页面导航和无刷新跳转。这个特性对于创建单页应用程序(SPA)和提升用户...
1. **History API**:在History模式中,Vue Router 使用了HTML5的History API。`pushState`用于添加一个新的历史记录条目,并改变当前URL;`replaceState`则替换当前的历史记录条目,不增加新的记录;`popstate`事件...
5. **浏览器兼容性**:History API是HTML5的一部分,因此需要考虑旧版本浏览器的兼容性问题。 了解了这些基本概念后,你可以深入学习如何将Ajax和History API结合起来,实现单页应用(SPA,Single Page Application...