window.onpopstate、window.history.pushState、window.history.replaceState、window.onpageshow

2024-03-14 19:48

本文主要是介绍window.onpopstate、window.history.pushState、window.history.replaceState、window.onpageshow,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

window.onpopstate、window.history.pushState、window.history.replaceState、window.onpageshow、visibilitychange

1、window.onpopstate、window.history.pushState、window.history.replaceState  API的区分

window.onpageshow

控制浏览器历史记录的api——window.onpopstate(),每当处于激活状态的历史记录条目发生变化时,popstate事件就会在对应window对象上触发

window.history.pushState().   window.histoey.replaceState()
添加和修改历史记录条目,与window.onpopstate 配合使用

window.onpopstate触发时机:
1)点击浏览器的前进、后退按钮,安卓的后退按钮
2)在js中调用history.go()      history.forward()       history.back()
3)a标签的锚点
4)当网页加载时,各浏览器对popstate事件是否触发有不同的表现,Chrome 和 Safari会触发popstate事件, 而Firefox不会

注意:history.pushState() history.replaceState()不会触发window.onpopstate()方法

window.history对象具有的属性
window.history = {
    length:1,
    pushState: fn,
    replaceState: fn,
   scrollRestoration: ‘auto’,
   state: null ,
   __proto__: {
        back: fn,
        forward: fn,
        go: fn,
        length:1,
        pushState: fn,
       replaceState: fn,
       scrollRestoration: ‘auto’,
       state: null 
   }
}

window.history.length:表示在同一个tab,会话历史中元素数总个数
比如有a.html    b.html.    c.html.     d.html四个页面

首次打开a.html页面,这时候history.length=1

从a.html跳到b.html,使用location.href或者this.$router.push()跳转,这时候history.length=2

从b.html跳到c.html,使用location.href或者this.$router.push()跳转,这时候history.length=3

从c.html跳到a.html,使用history.go(-2)跳转,这时候history.length=3

从a.html跳到b.html,使用location.href或者this.$router.push()跳转,这时候history.length=3

总结:也就是history.length记录了同一个tab中,栈中元素总个数

 

如果用新开webview的方式打开该页面,则该页面相当于在另外一个tab中,所以当前history.length = 1

history=3表示同一个tab里面有3条历史数据记录,最多向前回跳两个页面


如果用location.href或者this.$router.push()、history.pushState()方法跳转,则会向历史记录栈中添加一条数据

this.$router.replace()方法则不会向历史记录栈中添加数据

注意 pushState() 绝对不会触发 hashchange 事件,即使新的URL与旧的URL仅哈希不同也是如此

history.replaceState() 的使用与 history.pushState() 非常相似,区别在于  replaceState()  是修改了当前的历史记录项而不是新建一个

$router.push()和$router.replace()都会触发window.onpopstate方法

 

2、判断页面是否是后退进入,可以监听方法pageshow方法,event.persisted === true 表示后退进入,并非首次加载,同时使用window.performance && window.performance.navigation.type === 2做兼容
window.onpageshow = function (event) {
  // 判断是否是后退进入
  if (event.persisted || (window.performance && window.performance.navigation.type === 2)) {
    if (router.currentRoute.path === '/order' ||
      router.currentRoute.path === '/cartOrder' ||
      router.currentRoute.path === '/coupon-detail' ||
      router.currentRoute.path === '/order-detail' ||
      router.currentRoute.path === '/exchange-order' ||
      router.currentRoute.path === '/goods-detail') {
      window.location.reload()
    }
  }
}

注意:window.onpageshow方法触发的时机:第一次加载页面、前进或者后退到该页面都会触发

 

3、visibilitychange事件:页面显示和隐藏的时候会触发。注意:第一次加载完成页面的时候不会触发该方法

触发时机:当在浏览器中切换tab项,或者页面从后台唤醒(即app间的切换),这时候会触发visibilitychange事件两次:先是document.visibilityState=hidden,然后是document.visibilityState=visible

如果想在页面唤醒的时候,做一些处理,可以用该方法做监听,https://developer.mozilla.org/zh-CN/docs/Web/API/Document/visibilitychange_event

// 1、在document对象添加监听事件,不要在window对象上添加,上为了兼容safari<14的时候
// 2、回调函数要用箭头函数,这样能保持this指向不变,比如vue中,this就指向当前vue文件中的实例对象,可以访问this.$route对象等属性
// 如果回调函数是这种形式function () {},那么在回调函数中的this指向就是window对象
document.addEventListener('visibilitychange', () => {if (document.visibilityState === 'visible') {// do something}
})

有的时候,我们会用app提供的唤端方法做处理,但是有的时候该方法不能监听到唤端事件,这时候可以考虑用visibilitychange事件做监听处理

 

这篇关于window.onpopstate、window.history.pushState、window.history.replaceState、window.onpageshow的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/809538

相关文章

js window.addEventListener 是什么?

window.addEventListener 是 JavaScript 中的一个方法,用于向指定对象(在这个情况下是 window 对象,代表浏览器窗口)添加事件监听器,以便在该对象上发生特定事件时执行相应的函数(称为事件处理函数或事件监听器)。 这个方法接受三个参数: 事件类型(type):一个字符串,表示要监听的事件类型。例如,"click" 表示鼠标点击事件,"load" 表示页面加

Qt中window frame的影响

window frame 在创建图形化界面的时候,会创建窗口主体,上面会多出一条,周围多次一圈细边,这就叫window frame窗口框架,这是操作系统自带的。 这个对geometry的一些属性有一定影响,主要体现在Qt坐标系体系: 窗口当中包含一个按钮,这个按钮的坐标系是以父元素为参考,那么这个参考是widget本体作为参考,还是window frame作为参考,这两种参考体系都存在

Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.B

一个bug日志 FATAL EXCEPTION: main03-25 14:24:07.724: E/AndroidRuntime(4135): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.syyx.jingubang.ky/com.anguotech.android.activity.Init

最初的window

不知你是否也是一个常年在MFC下编程的程序员,有的时候是否忘记了在MFC之前是如何写画窗口的了呢,或者你从来都只是机械的在MFC下面写代码,已经麻木了。其实有一个很简单的方法,或许能够帮你更清楚的了解WINDOW是怎么产生的。 随便用什么版本的VS,在创建win32工程的时候,直接创建WINDOW类型的就OK了。然后,来研究下产生的源代码吧。 // Global Variables:H

VC环境下window网络程序:UDP Socket程序

最近在学Windows网络编程,正好在做UDPsocket的程序,贴上来: 服务器框架函数:              socket();    bind();    recfrom();  sendto();  closesocket(); 客户机框架函数:            socket();      recfrom();  sendto();  closesocket();

Window下编译OpenJDK17

本文详细介绍Window下如何编译OpenJDK17,包含源码路径,各工具下载地址,严格按照文章中的步骤来操作,你将获得一个由自己亲手编译出的jdk。  一、下载OpenJDK17源码 下载地址:GitHub - openjdk/jdk at jdk-17+35 说明: 1、kkgithub为github的国内镜像,能够提高下载速度  2、下载下来的源码存放路径:无中文、无空格

POJ 2823 Sliding Window(线段树入门)

题意: 8 31 3 -1 -3 5 3 6 7 一串数列,有一个窗口大小为3,从数列开始往后移动,输出最大和最小值。 -1 -3 -3 -3 3 33 3 5 5 6 7 窗口大小为3 思路: 维护一个线段树,代码很详细 解题心得: 因为关键值的输入量有1000000,也就是叶节点有1000000个,总节点按理说是2000000-1,但这题得开3000000才能过

history命令内容格式优化:添加日期时间及IP地址

目录 一、历史记录格式1.1操作步骤1.2其他说明 二、历史记录问题2.1记录显示不全2.2定时自动记录 一、历史记录格式 1.1操作步骤 [可选步骤]清空当前历史记录:history -c && > ~/.bash_history && history -r 编辑对应的配置文件: 用户配置文件:vim ~/.bashrc系统配置文件[推荐]:sudo vim /etc

Vue 项目hash和history模式打包部署与服务器配置

你好,我是沐爸,欢迎点赞、收藏、评论和关注。 在开发 Vue 项目时,Vue Router 提供了两种模式来创建单页面应用(SPA)的 URL:hash 模式和 history 模式。 简单说下两者的主要区别: hash 模式下的 URL 看起来不那么美观,带有一个 # 符号。在这种模式下,URL 中的 hash 值(# 后面的部分)会改变,但页面不会重新加载。因为不会向服务器发送请求,服

Flink原理与实现:Window的实现原理

硬刚大数据系列文章链接: 2021年从零到大数据专家的学习指南(全面升级版) 2021年从零到大数据专家面试篇之Hadoop/HDFS/Yarn篇 2021年从零到大数据专家面试篇之SparkSQL篇 2021年从零到大数据专家面试篇之消息队列篇 2021年从零到大数据专家面试篇之Spark篇 2021年从零到大数据专家面试篇之Hbase篇