/* @flow *///用于判断是否是浏览器环境
import { inBrowser } from './dom'
//保存滚动的位置(x,y).
import { saveScrollPosition } from './scroll'
// genStateKey 生成基于当前时间时间戳的key。
// setStateKey 更新key。
// getStateKey 获取key。
import { genStateKey, setStateKey, getStateKey } from './state-key'
// extend(a, b) 将 b 对象中属性浅拷贝到 a 对象中。
import { extend } from './misc'/*判断浏览器是否支持 history 模式。
*/
export const supportsPushState =//inBrowser 是否是浏览器环境。inBrowser &&(function () {//获取用户代理对象。const ua = window.navigator.userAgent//满足下面条件的 ua,则不支持 html5 的导航模式。if ((ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) &&ua.indexOf('Mobile Safari') !== -1 &&ua.indexOf('Chrome') === -1 &&ua.indexOf('Windows Phone') === -1) {return false}//判断window 是否存在 history对象,且 pushState 方法是否存在。//如果都存在,则表明支持 html5 的导航模式。return window.history && typeof window.history.pushState === 'function'})()/*push 方式跳转新路径,会在 history 中记录。
*/
export function pushState(url?: string, replace?: boolean) {//保存当前页面滚动的位置。saveScrollPosition()// try...catch the pushState call to get around Safari// DOM Exception 18 where it limits to 100 pushState calls//获取导航对象const history = window.historytry {if (replace) {//保存之前 history 的 state。// preserve existing history state as it could be overriden by the userconst stateCopy = extend({}, history.state)stateCopy.key = getStateKey()//使用 history 的 replace 方法。// 第一个参数是 state.  这里就是 { key: “当前时间的时间戳字符串”  }// 第二个参数是 title, 这个值没有意义了。// 第三个参数是  url, 要跳转的url。history.replaceState(stateCopy, '', url)} else {//使用 history 的 push 方法。// 第一个参数是 state// 第二个参数是 title// 第三个参数是  urlhistory.pushState({ key: setStateKey(genStateKey()) }, '', url)}} catch (e) {//如果抛出了异常,则表示栈已经到了最大值,不能push了。//使用 location.assign 也可以用来跳转网址,且 assign 会添加记录到浏览历史,点击后退可以返回到之前页面。window.location[replace ? 'replace' : 'assign'](url)}
}/*replace 方式跳转新路径,不会在 history 中记录。
*/
export function replaceState(url?: string) {//第二个参数是 true,表示以 replace 的方式去跳转到新页面。pushState(url, true)
}

vue-router3 源码注释系列 /src/util/push-state.js相关推荐

  1. vue-router3 源码注释系列 /src/util/query.js

    /* @flow */import { warn } from './warn'//判断字符为 !'()* 的正则表达式. const encodeReserveRE = /[!'()*]/g /* ...

  2. vue-router3 源码注释系列 /src/util/scroll.js

    /* @flow */import type Router from '../index' import { assert } from './warn' //getStateKey: 用于获取时间戳 ...

  3. vue-router3 源码注释系列 /src/util/path.js

    /* @flow *//*** resolvePath(): 解析路径* 第一个参数: 相对路径,要跳转路径的 pathname.* 第二个参数: 基准路径.* 第三个参数: 是否需要拼接基准地址.* ...

  4. vue源码注释系列 /src/module/module.js

    import { forEachValue } from "../util";// Base data struct for store's module, package wit ...

  5. vue-router3源码注视系列 /src/index.js

    /* @flow *///install: vue.use( VueRouter ) 时调用的 install() 方法. import { install } from './install' // ...

  6. vue源码:Watcher系列(一)

    少年驰骋,仗剑天涯 愿你眼眸有星辰,心中有大海 从此,以梦为马,不负韶华 在分析之前我们先来看看,vue中都有哪些Watcher种类呢?以及分别在什么时候创建呢?从vue源码里面看,Watcher是一 ...

  7. vue 计算属性_lt;Vue 源码笔记系列6gt;计算属性 computed 的实现

    1. 前言 原文发布在语雀: <Vue 源码笔记系列6>计算属性 computed 的实现 · 语雀​www.yuque.com 上一章我们已经学习过 watch,这一章就来看一下计算属性 ...

  8. vue如何让一句代码只执行一次_lt;Vue 源码笔记系列4gt;异步更新队列与$nextTick...

    1. 前言 原文发布在语雀: <Vue 源码笔记系列4>异步更新队列与$nextTick · 语雀​www.yuque.com 上一章我们讲到了修改数据是如何触发渲染函数的观察者,最终调用 ...

  9. vue源码分析系列二:$mount()和new Watcher()的执行过程

    续vue源码分析系列一:new Vue的初始化过程 在initMixin()里面调用了$mount() if (vm.$options.el) {vm.$mount(vm.$options.el);/ ...

最新文章

  1. 将编译器pass添加到Relay
  2. 关于C#开发山寨操作系统,程序语言,浏览器,IDE,Office,Photoshop等大型程序的可行性歪论及意义...
  3. 动态查询设置mysql慢查询
  4. vue+vue-router+vuex实战
  5. 设置IE安全并打开自动仿冒网站筛选器和IE安全设置
  6. php cookie 加密解密,php实现cookie加密的方法
  7. 电子相册系统(一)Dao的组件设计
  8. Java学习笔记-Java概述和环境配置
  9. 金山毒霸2012秒杀全新病毒
  10. 将10件商品的英文名称存储在数组中,输出名称的第3个字符是‘b‘的所有商品英文名称;再输出名称的长度小于6个字符的商品英文名称。
  11. 命令行运行ktr和kjb
  12. Matlab中IFFT/FFT注意事项及在OFDM仿真中的应用问题
  13. 基于Tcl脚本生成Vivado工程及编译
  14. composer的原理和正确使用(最新)
  15. 5个超经典实验,老杨带你高效进阶OSPF
  16. 2021-2025年中国脚手架系统行业市场供需与战略研究报告
  17. Identifying and Tracking Sentiments and Topics from Social Media Texts during Natural Disasters
  18. 子域名扫描工具-Sublist3r
  19. 基于STM32水温炉温温度控制系统电路设计-分享
  20. 如果我不爱你…伤感日志分享

热门文章

  1. 素因子分解法的优化代码
  2. RoboCup 2D足球仿真项目team_logo制作教程
  3. Win10+GeForce 940M(CUDA8.0)+Visual Studio 2015的GPU环境配置步骤
  4. 中石油联手京东 启动昆仑加油卡线上积分商城
  5. gem淘宝镜像,ios swift jazzy文档生成 教程
  6. 防火墙乐动体育 OPNsense 19.7 "Jazzy Jaguar"发布
  7. swing表格JTable隐藏某一列
  8. 笔记本电脑电池充电技巧
  9. 百度地图绘制历史轨迹加标注,简易版
  10. 科烨盈创祝贺2015中国呼叫中心及企业通信大会圆满成功