location更新URL地址,
使用location对象可以通过很多方式来改变浏览器的位置,每次修改location的属性(hash除外),页面都会以新URL重新加载。
浏览器的历史记录中就会生成一条新记录,用户通过单击"后退"按钮都会导航到前一个页面。
要禁用这种行为,可以使用location.replace(URL)方法
结果虽然会导致浏览器位置改变,但不会在历史记录中生成新记录。在调用replace()方法之后,用户不能回到前一个页面、、
前端改变浏览器地址而不刷新页面,有两种方法:改变hash(只能改变hash值) 和html5 History改变浏览器地址。
虽然通过hashchange等一系列操作也能满足router需求,但是hash router 对搜索引擎不友好(hash值不会发送给服务端,静态化页面时难以保持路径一致),难以追踪用户行为。
从HTML5开始提供了对history栈中内容的操作。history.pushState()和history.replaceState()方法,他们分别可以添加和修改历史记录条目。这些方法通常与window.onpopstate配合使用。像angularJS Vue react 等router模块都提供有 hash模式和HTML5 History 模式
详细的推荐查看:https://developer.mozilla.org/zh-CN/docs/Web/API/History
使用back(),forward(),go()方法来完成在用户历史记录中向后和向前跳转。
在history中向后跳转
向前跳转
当前页
使用history.pushState()可以改变referrer(引用),它在用户发送XMLHttpRequest请求时在HTTP头部使用,改变state后创建的XMLHttpRequset对象的referrer都会被改变。因为referrer是标识创建XMLHttpRequest对象时this所代表的window对象中document的URL。
JavaScript修改浏览器URL地址栏,不刷新页面(vue、react项目服务端渲染,可以保持访问地址一致)
var stateObject = {};
var title = "zhoulujun.cn test page";
var newUrl = "/zhoulujun/demo/test";
history.pushState(stateObject,title,newUrl);
推荐阅读:https://router.vuejs.org/zh/guide/essentials/history-mode.html
每当活动的历史记录项发生变化时, popstate 事件都会被传递给window对象。
在history.back(),history.forward(),history.go()时触发此事件,但是在history.pushState();history.replaceState();时并不会触发此事件,但事件内可以获取到state状态值
各浏览器对popstate事件是否触发有不同的表现,Chrome和Safari会触发popstate事件,而FireFox不会。
参考文章:
从了解Hash和Html5 History 到简单实现路由 https://segmentfault.com/a/1190000019991267
HTML5 history详解 https://blog.csdn.net/garrettzxd/article/details/80657281
转载本站文章《再谈location与history之跳转转态监控—router的两种实现模式》, 请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/js6/2016_0425_7787.html
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。