1. pushState是什么?
这两天在实习中,要将官网的后台系统扩展,其中的一个点就是将页面的主体内容用iframe来引用,在被iframe的高度坑过一遍之后,一个问题又浮现在我的脑海中:
使用iframe时,如果用户点击了浏览器的后退按钮,因为使用的是iframe,那么这时候整个页面都会后退,而不是用户所预料的只是iframe中页面的后退。
针对于这个问题,首先想到的就是H5的新方法history.pushState()
、history.replaceState()
和window.onpopstate
事件,但是当时由于在忙别的,所以在这个问题没有细想。
简单的说,history对象下的pushState是H5提出的一个新方法,可以将浏览器窗口的URL修改为自己想要的路径,并且将这个路径push到当前页面的页面浏览历史中。
要注意的是,这种URL的修改不会让页面刷新,亦即不会让页面发生跳转!
1.1 history.pushState(state, title, url);
pushState
的参数一共有三个:
state
:可以是一个null,也可以是一个完整的对象,用来表示要push的url对应的状态信息。title
:字符串,声明要push的url对象的title,实际使用时并没有什么鸟用。url'
:要push的history栈里的url,同时也是显示在浏览器地址栏中的地址。要注意该url不能跨域。
根据该方法传入的state,我们可以通过控制台输出history
查看其state
,如果该url不是通过pushState
或replaceState
产生的,那么history.state
就是一个null。当然,如果你在pushState时传的state本来就是null,那么当我没说吼。
在Chrome控制台测试该接口,可以看到调用了pushState
方法之后,history
的length
增加了1,即将指定的url添加到了history
栈中。
1.2 history.replaceState(state, title, url)
replaceState
的参数与pushState的参数一致。
调用了replaceState
方法之后,history
的length
不变,指定的url没有被添加到history
栈中,仅仅只是浏览器地址栏的url改变。
2 window.onpopstate
window
下的popstate
事件是在history
发生变化时触发,也就是说调用history.go()
和history.back()
都会触发该事件。
但是要注意,我们上面提到的history.pushState()
和history.replaceState()
并不会触发该事件。
3 仓促结尾的说明
本来想延伸开来讲一下API的具体应用,但是由于种种原因,在这里就只是简单介绍API的使用方法,具体应用的话等到以后有机会再来介绍(其实就是还没有在生产环节用过…XD)。