(带效果动图)H5在详细页点返回,返回时列表页停留在原来的位置

news/2025/2/21 17:36:03

前言

  • 有了vue以后,我H5都是用vue写了,然后使用vant(轻量、可靠的移动端 Vue 组件库)布局,一个网页就特别容易的完成了,然后就是要优化网页。
  • 在工作中,H5主要被用来内嵌进移动端(ios、小程序、安卓),而各大应用中,用的最多的数据结构就是列表。用H5做列表网页,有一个很大的弊端就是:往下滑列表,然后点击跳转到详情网页再返回时,会发现列表页刷新并返回顶部了。
  • 这个弊端和浏览器有关系。(具体原因感兴趣的自查百度)
    • Microsoft Edge浏览器就能返回时列表停留在原来的位置
    • 红米手机上自带的浏览器也能返回时列表停留在原来的位置
    • 谷歌浏览器返回时就会刷新页面滑到顶部
    • ios、安卓的webview返回时就会刷新页面滑到顶部(如微信内部访问网页)

未优化前效果展示

在微信内部浏览器,往下滑列表,然后点击跳转到详情网页再返回时,会发现列表页刷新并返回顶部了,如图所示:

优化后效果展示

还是在微信内部浏览器

实现

思路

  • 既然是因为跳转到新的网页然后返回才会导致这个问题,我就不让跳到新网页,直接在原网页里内嵌。内嵌网页的方式:iframe。
  • 做到内嵌网页后,我们要实现点击安卓手机的返回键能够把这个内嵌网页关掉。应该有很多种方式,我自己做的是:监听返回键事件,然后执行自己的操作。

代码

1、html 代码

说明:

  • 有一个大盒子div,宽度高度与屏幕一样,即全屏(width: 100%; height: 100%;),显示位置置前(position: fixed; z-index: 999;),这两条一定要。
  • 居中 display: flex; justify- content: center;  align-items: center;
  • showPage 来控制内嵌网页的显示与隐藏。
  • iframe 的宽高为父容器的100%,即全屏。src放入子页面的url路径。
<div v-if="showPage == '1' " style="position: fixed; z-index: 999;display: flex; justify-    
    content: center;  align-items: center; background: white; width: 100%; height: 100%;">

    <iframe frameborder=0 width=100% height=100% :src="subPage"></iframe>

</div>

2、javascript vue 代码

说明:按照思路

  • 用变量showPage 来控制内嵌网页的显示与隐藏;
  • pushHistory()放入停留在之前浏览的位置的url,这个一定不要漏,不然返回的时候就直接退出列表页了!
  • 监听返回键:返回上一个网页的事件是无法拦截的,所以我们只能添加停留在之前浏览的位置的url也就是原url+#,然后在返回键事件里把内嵌网页隐藏掉,我们就能成功的使H5返回时不刷新页面,列表保持在原来的位置。
data: {
    showPage: "0", // showPage初始化,0隐藏,1显示
    ......
}

methods: {
    // 使用pushState方法往history里增加url链接:原url加个#,还是原页面并且停留在之前浏览的位置
    pushHistory() {
        var state = {
            title: "title",
            url: "#"
        }
        window.history.pushState(state, "title", "#");
    },

    // 打开内嵌网页
    getScore(name, score) {
        const that = this
        // 内嵌网页的url
        that.subPage = 'score.html?name=' + name +'&score=' + score
        // 内嵌网页显示
        that.showPage = '1'
        // 放入停留在之前浏览的位置的url,这个一定不要漏,不然返回的时候就直接退出列表页了!
        that.pushHistory()
        // 监听返回键
        window.addEventListener("popstate", function(e) {
            // 内嵌网页隐藏
            that.showPage = '0'
        })
    },

    // 打开另一个内嵌网页 
    getRatings(name, date) {
        const that = this
        that.subPage = 'ratings.html?name=' + name + '&date=' + date;
        that.showPage = '1'
        that.pushHistory()
        window.addEventListener("popstate", function(e) {
            that.showPage = '0'
		})
    },
    ......
}

3、内嵌网页,标题栏的返回按钮点击事件(ios不像安卓手机那样屏幕底部有返回键,所以网页顶部要布置一个返回按钮)

onBack() {
    window.history.back(-1);//返回上一层
},

参考资料

JS监听浏览器的返回事件_柏灿的博客-CSDN博客_监听浏览器返回事件


http://www.niftyadmin.cn/n/1365335.html

相关文章

opencv支持多种流行视频格式文件的读取

写入应该是只支持avi,因为其他格式一般都是压缩格式&#xff0c;压缩格式一般都有帧间压缩,也就是不能只写一帧,可以保存为avi后&#xff0c;转码. 以AVI结尾的视频文件有以下几种&#xff1a; 1、非压缩格式的AVI文件&#xff08;或是MPEG1格式的&#xff09;&#xff0c;这个…

免费的在线MP4视频转gif工具,不注册不登录不花钱不安装

工具链接在文档底部&#xff0c;别打我。。。 说明 这个在线的视频转GIF工具真的很好&#xff0c;不用注册不用登录不用花钱不用安装 效果展示 我写csdn博客会用到动图&#xff0c;效果可以点击下面两个链接看看 &#xff08;动图教学&#xff09;Typora 打小黑点&#xff…

MFC CString 字符串截取

CString str_T("aaa;vvv");int indexstr.Find(_T(";")); strstr.Left(str.GetLength()-index-1); AfxMessageBox((LPCTSTR)str); 转载于:https://www.cnblogs.com/marky/archive/2012/04/03/2431009.html

H5网页的Vant的Icon图标显示不出来

第一个原因 先检查你的Vue环境弄好了没有。 说明 1、H5用CDN的方式引入Vue和Vant。 <!-- 引入样式文件 --> <linkrel"stylesheet"href"https://cdn.jsdelivr.net/npm/vant2.12/lib/index.css" /><!-- 引入 Vue 和 Vant 的 JS 文件 --&g…

初学Oracle----连接数据库及其基本命令

一、连接数据库 当Oracle装好后&#xff0c;首先我们要连接数据库&#xff0c;在确保Oracle的服务启动的情况下&#xff0c;打开DOS命令窗口&#xff0c;即&#xff1a; 鼠标单击开始——运行——输入cmd。此时我们可以看到DOS窗口&#xff0c;然后输入sqlplus system/oracle即…

接口时而可以访问时而报404

第一个原因 你有多个服务器&#xff0c;为了做负载均衡&#xff0c;就做了多个网关。报404是网关反馈给你的异常&#xff0c;这时候&#xff0c;多个网关中&#xff0c;把其他的网关下线&#xff0c;检测问题具体出现在哪个服务器。然后看一下&#xff0c;你那台服务器中运行的…

H5的标题栏置顶css样式实现(附通用标题栏全代码)

前言 H5的标题栏置顶的实现方式有多种&#xff0c;但是我们的置顶还需要满足下面两种情况&#xff1a; 1、滚动时标题栏也要置顶 2、标题栏处不应该显示滚动条 如图所示&#xff1a; 简单的置顶四要素&#xff0c;不能实现滚动时标题栏也能置顶&#xff1a; position: fix…

xuint和其他的单元测试框架的比较

主要从2个方面比较&#xff0c;特性和断言。 第一部分 &#xff1a;特性的比较。 NUnit 2.2 MSTest xUnit.net Comments [Test] [TestMethod] [Fact] 代表测试方法[TestFixture] [TestClass] n/a xuint不需要为任何一个类准备特性。它会在程序集public类中进行测试方法的查询。…