https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history
DOM中的window对象通过window.history方法提供了对浏览器历史记录的读取,让你可以在用户的访问记录中前进和后退。
从HTML5开始,我们可以开始操作这个历史记录堆栈。
1.History
使用back(),forward(),和go()方法可以在用户的历史记录中前进和后退
前进和后退
后退:
window.history.back();
这个方法会像用户点击了浏览器工具栏上的返回键一样。
同样的,也可以用以下方法产生用户前进行为:
window.history.forward();
移动到历史记录中特定的位置
你可以使用go()方法从session历史中载入特定的页面。
向后移动一页:
window.history.go(-1);
向前移动一页:
window.history.go(1);
类似的,你可以前进或者后退多页。
还可以通过检查浏览器历史记录的length属性来找到历史记录堆栈中的页面总数。
var numberOfEntries = window.history.length;
注意:IE支持向go()方法传URL参数。
2.添加和修改history实体
自Gecko2开始引入 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
HTML5引入了histtory.pushState()和history.replaceState()这两个方法,他们允许添加和修改history实体。同时,这些方法会和window.onpostate事件一起工作。
使用history.pushState()方法来修改referrer,这种方法可以被用在经过修改状态后而为xmlhttpRequest对象创建的http header中。这个referrer会是创建XMLHttpRequest 时document的URL。
pushState 用于向 history 添加当前页面的记录,而 replaceState 和 pushState 的用法完全一样,唯一的区别就是它用于修改当前页面在 history 中的记录。
例子
假设http://mozilla.org/foo.html页面执行了一下JS
var stateObj = { foo: "bar" }; history.pushState(stateObj, "page 2", "bar.html");
这种方法将会使url地址栏显示http://mozilla.org/bar.html,但浏览器不会加载bar.html页面,即使这个页面存在也不会加载。
现在再次假设用户继续访问http://google.com,然后点击后退。这时,url地址栏将会,http://mozilla.org/bar.html,页面会得到popstate事件(chrome),这个状态对象会包含一个stateObj的copy。这个页面看起来像foo.html。+
这时,我们再次点击后退,URL将变成http://mozilla.org/foo.html,document将得到另一个popstate事件和为null的state对象。这次的返回动作并没有改变文档的内容。(也许会过一会尝试加载…chrome)
pushState方法
pushState()有三个参数:state对象,标题(现在是被忽略,未作处理),URL(可选)。具体细节:
· state对象 –state对象是一个JavaScript对象,它关系到由pushState()方法创建出来的新的history实体。用以存储关于你所要插入到历史 记录的条目的相关信息。State对象可以是任何Json字符串。因为firefox会使用用户的硬盘来存取state对象,这个对象的最大存储空间为640k。如果大于这个数 值,则pushState()方法会抛出一个异常。如果确实需要更多的空间来存储,请使用本地存储。
· title—firefox现在回忽略这个参数,虽然它可能将来会被使用上。而现在最安全的使用方式是传一个空字符串,以防止将来的修改。或者可以传一个简短的标题来表示state
· URL—这个参数用来传递新的history实体的URL,注意浏览器将不会在调用pushState()方法后加载这个URL。但也许会过一会尝试加载这个URL。比如在用户重启了浏览器后,新的url可以不是绝对路径。如果是相对路径,那么它会相对于现有的url。新的url必须和现有的url同域,否则pushState()将抛出异常。这个参数是选填的,如果为空,则会被置为document当前的url。
某种意义上来说,调用pushState()方法很像设置了window.location = “#foo”,这两者都会创建和激活另一个关联到当前document的history实体,但pushState()另外有一些优点:
l 新的url可以是任何和当前url同域的url,相比之下,如果只设置hash,window.location会保持在同一个document。
l 如果不需要,你可以不修改url。对比而言,设置window.location = “#foo”;仅产生新的history实体,如果你当前的hash不是#foo
l 你可以将任意的数据与你的新history实体关联。使用基于hash的方法,需要将所有相关的数据编码为一个短字符串。
注意,pushState()方法不会使hashchange时间发生,即使是新旧url只是hash不同。
replaceState()方法
history.replaceState() 用起来很像pushState(),除了replaceState()是用来修改当前的history实体而不是创建一个新的。这个方法有时会很有用,当 你需要对某些用户行为作反应而更新一个state对象或者当前history实体时,可以使用它来更新state对象或者当前history实体的url。
popstate事件
当history实体被改变时,popstate事件将会发生。如果history实体是有pushState和replaceState方法产生的,popstate事件的state属性会包含一份来自history实体的state对象的拷贝
详见window.onpopstate
读取当前的state
读取现有state
当页面加载时,它可能会有一个非空的state对象。这可能发生在当页面设置一个state对象(使用pushState或者replaceState)之后用户重启了浏览器。当页面重新加载,页面将收到onload事件,但不会有popstate事件。然而,如果你读取history.state属性,将在popstate事件发生后得到这个state对象
var currentState = history.state;
Browsers: Tested and Working In
HTML5 Browsers
Chrome 8,9,10
Firefox 4
Safari 5
Opera 11
Safari iOS 4.3
HTML4 Browsers
IE6,7,8,9
Firefox 3
Opera 10
Safari 4
Safari iOS prior to version 4.3
分享到:
相关推荐
HTML5的History API提供了pushState和replaceState两个方法,可以解决这个问题。 一、HTML5 History API HTML5的History API提供了对浏览器历史记录的访问和操作能力。它提供了pushState和replaceState两个方法,...
总之,`pushState`和`replaceState`是HTML5中增强用户体验的重要工具,它们允许开发者在不重新加载页面的情况下更新URL和管理历史记录,从而创建更动态、更友好的Web应用。结合`popstate`事件,可以实现无刷新的页面...
HTML5的`history.pushState()`和`history.replaceState()`是两个关键的方法,它们允许开发者在不重新加载页面的情况下改变浏览器的历史记录。这两个方法是HTML5的History API的一部分,主要用于实现单页应用(SPA)...
history.pushState 和 history.replaceState 可以在不刷新当前页面的情况下更改URL,但是这样就无法获取通过AJAX得到的新页面的内容了。 虽然各种HTML5文档说 [removed] 事件可以拦截 pushState 的消息,但在实际的...
本篇文章介绍的是利用AJAX技术和HTML5中新增的History API中的history.pushState和history.replaceState方法,实现在不刷新页面的情况下改变浏览器的URL地址。下面将详细介绍这些技术的具体用法和应用场景。 ### ...
为了解决这一问题,我们可以通过HTML5提供的history对象的pushState、replaceState方法和onpopstate事件来实现页面的前进后退功能。 首先,pushState和replaceState方法属于history对象,它们允许我们修改浏览器的...
HTML5的`pushState`方法扩展了`history`对象的功能,允许开发者在历史记录中添加新的记录点,而不会实际加载新的页面。该方法接受三个参数:状态对象(用于存储与历史记录点相关的数据,可为空)、页面标题(目前...
可以完全按照例如Dive Into HTML5书( )或History API规范( )中的描述使用该库 )。 您可以使用以下命令安装此插件: npm install html5-history-api 浏览器支持: history.js -IE8 +和其他浏览器 history....
window.history.back();...history.pushState与history.replaceState history.pushState会增加一条历史记录, history.replaceState会替换而不会增加,所以会更舒适一点。 以上所述是小编给大家介绍的HTML
首先,History API包括三个主要方法:`pushState()`, `replaceState()`和`popstate`事件。这些方法允许开发者在不重新加载页面的情况下改变浏览器的URL,提供了一种创建单页应用(SPA)的强大工具。 1. **`push...
尽管也存在一些,但由于您只能使用本机HTML5 History API,因此它们相对较小。 如果您打算支持旧版浏览器,那么可以使用History.js。 该通知位于此处,因为History.js没有获得足够的资金来维护,因此它仅在旧版...
3. 配置SPA:在前端代码中,正确使用History API,例如通过`history.pushState()`或`history.replaceState()`更改URL。 4. 访问SPA:现在,SPA可以通过`history-server`启动的服务器地址进行访问,即使直接输入SPA...
H5 History 模式是Vue Router的一种路由模式,利用HTML5的新特性,提供了更加友好的URL,使得页面刷新时依然能保持正常工作。 Vue Router 的 History 模式是基于浏览器的History API(pushState、replaceState 和 ...
使用 HTML5 的 History API,特别是 pushState 和 replaceState 两个方法,可以实现无刷新改变页面 URL。 History.pushState(state, title, url) 将当前 URL 和 history.state 加入到 history 中,并用新的 state ...
H5,即HTML5,引入了一些新特性来帮助开发者实现这一目标,其中最关键的是History API和PushState方法。接下来,我们将详细讨论如何利用这些技术实现无刷新更换URL以及特定情境的历史返回。 1. History API: ...
Vue-router 的 HTML5 History 模式就是基于 pushState() 和 replaceState() 的。它能够在不刷新页面的情况下改变URL,实现前端的路由控制。开发者在使用时,可以通过 vue-router 的编程式导航来实现控制,如使用 ...
15. History管理和PushState:改进了浏览器的历史管理,通过`History.pushState()`和`History.replaceState()`方法,可以实现无刷新的页面导航,提升用户体验。 以上十五个特性极大地扩展了HTML的功能,使得开发者...