JS 刷新保持iframe页面并支持浏览器前进后退

news/2024/10/17 9:09:00/

参考资料

  1. html5新特性:利用history的pushState等方法来解决使用ajax导致页面后退和前进的问题
  2. 击按钮切换iframe的src,这个路径如何不会被记录到history中?
  3. iframe 后退 浏览器history 问题
  4. ajax与HTML5 history pushState/replaceState实例

目录

  • 一. 遇到的问题
  • 二. 问题分析
  • 三. 代码示例
  • 四. 代码分析
  • 五. 效果


一. 遇到的问题

我们使用iframe嵌套自己系统的页面,但是浏览器刷新之后,无法保持当前打开的页面

在这里插入图片描述


二. 问题分析

⏹原因
之所以会刷新页面后无法保持住当前打开的页面,是因为浏览器地址栏的url始终是固定的,我们打开的页面改变的是iframe标签的src属性值,从而实现不同页面之间的切换。

⏹解决
在url的后面添加?name=当前画面id,当我们进入页面之后,根据name的参数值,来改变iframe标签,从而实现刷新后页面保持。


三. 代码示例

⏹登录页面,点击后登录到系统的首页

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><button id="login">点击登录系统</button>
</body>
<script>login.addEventListener("click", function() {location.replace("./03-2-系统页面.html?name=home");});
</script>
</html>

⏹主系统页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><style>#contanier {display: flex;justify-content: space-between;}iframe {/* 根据视口的宽度和高度计算iframe的宽和高 */width: calc(100vw - 150px);height: calc(100vh - 30px);}</style><title>系统首页</title>
</head>
<body><div id="contanier"><div id="menu"><li id="es6">ES6网站</li><li id="css">css网站</li><li id="java">java网站</li><li id="php">php网站</li></div><div id="content"><iframe></iframe></div></div>
</body>
<script src="https://code.jquery.com/jquery-3.6.3.js"></script>
<script>// 页面的工具类class Utils {// 模拟从后台获取到的菜单栏以及其urlstatic urlMap = new Map([['es6', './03/02-es6.html'],['css', './03/03-css.html'],['java', './03/04-java.html'],['php', './03/05-php.html'],['home', './03/01-首页.html']]);// 获取本页面不含参数的urlstatic getUrl() {const {origin,pathname} = location;return origin + pathname;}// 获取url中指定的参数static getParamFromUrl(url, param) {return new URLSearchParams(new URL(url).search).get(param);}}$(function() {// 事件绑定eventBind();// 加载页面loadPage();});function eventBind() {// 当浏览器前进后退时,会触发popstate事件window.addEventListener("popstate", function(evnet) {loadPage();});$("#menu li").click(function(event, triggerFlg) {const pageId = this.id;reloadIframe(pageId);/*如果是用户手动点击触发,则将当前url添加到浏览器的history中如果是通过函数来触发的点击事件,则不将url添加到浏览器的history中*/if(!triggerFlg) {history.pushState(null, "", `${Utils.getUrl()}?name=${pageId}`);}});}function loadPage() {const pageId = Utils.getParamFromUrl(location.href, "name");// 如果url中没有 ?name=对应的属性值,或者Utils.urlMap中没有pageId对应值的话if(!pageId || !Utils.urlMap.get(pageId)) {// 将当前 url + ?name=home 的路径替换到浏览器的history中history.replaceState(null, "", `${Utils.getUrl()}?name=home`);// 重载页面,此时url中的参数为?name=homeloadPage();return;}// 如果当前是home页的话,就重载iframe标签if(pageId == "home") {reloadIframe(pageId);return;}/*手动触发点击事件第二个参数是为了在手动触发点击事件的时候传递一个参数传递此参数的目的是为了让点击事件的回调区分,当前点击事件是用户主动点击触发,还是通过函数来手动触发的*/$("#" + pageId).trigger("click", true);}function reloadIframe(pageId) {// 清空iframe标签$("#content").empty();// 创建新的iframe标签,并指定url$("<iframe>", {src: Utils.urlMap.get(pageId)}).appendTo($("#content"));}
</script>
</html>

四. 代码分析

  • reloadIframe方法中,我们并不是直接修改的iframe标签的src属性,而是销毁掉既存的iframe标签,并新创建一个。如果直接修改src属性的话,src中的地址会直接存入history对象中,给浏览器前进后退功能带来影响。直接创建iframe标签,src中的地址并不会写入history对象中。
  • 由于新创建的iframe标签的src属性值并不会存入history对象中,因此我们需要手动调用history.pushState()这个api来存入到history对象中。
  • $("#menu li")上的点击事件可由用户主动点击触发,也可由window上的popstate事件手动触发,当是由popstate事件手动触发时,说明用户使用了浏览器的前进后退功能,此时不需要将url存储history中。

五. 效果

在这里插入图片描述


http://www.ppmy.cn/news/431937.html

相关文章

鸿蒙系统熄屏显示,EMUI 11曝光!华为魔改 Android 11:息屏显示、智慧分屏焕然一新...

原标题&#xff1a;EMUI 11曝光&#xff01;华为魔改 Android 11&#xff1a;息屏显示、智慧分屏焕然一新 8月28日消息&#xff0c;据国内知名数码博主透露&#xff0c;华为对即将发布的全新 EMUI 11 操作系统进行大量魔改&#xff0c;其中包括息屏显示 AOD 设计、应用智慧分屏…

【MATLAB】 曲面的绘制

版本&#xff1a;R2020b 题目 观察二次曲面族 z x 2 y 2 k x y zx^2y^2kxy zx2y2kxy 的图形。特别注意确定 k k k 的这样一些值&#xff0c;当 k k k 经过这些值时&#xff0c;曲面从一种类型变成了另一种类型。 代码 clear; clc;x linspace(-1,1,50); y x; [X,Y] …

曲率

一、弧微分 1.1、有向弧段 1.2、弧微分公式 1.2.1、参数方程的弧微分公示1 二、曲率及其计算公式 2.1、讨论弯曲程度与角度、弧段的长度的关系 2.2、引入曲率概念 2.3、曲率计算公式 三、曲率圆与曲率圆半径 四、曲率中心计算公式、渐屈线和渐伸线 4.1、曲率中心计算公式 4.…

【Matlab】三维曲线与三维曲面

三维曲线与三维曲面 三维曲线 plot3函数 plot3(x, y, z)&#xff1a; x、y、z为同型向量时&#xff0c;每一个位置的(x, y, z)组成一个点的坐标。x、y、z为同型矩阵时&#xff0c;每一列对应一条曲线&#xff0c;因此&#xff0c;x&#xff08;或y或z&#xff09;的列数为绘…

matlab绘三维椭球面_Matlab绘制曲面

本文整理了一些三维绘图的内容,代码都比较简单 1、surf、surfc、surfl之后可以试试shading interp 2、绘制隐函数 3、参数方程绘制曲面 4、三维到平面:等高线+引力线 5、快速绘制球面(椭球面) 6、绘制旋转面 7、绕轴旋转 8、分段曲面 1、surf、surfc、surfl之后可以试试shadi…

二维、三维 曲线曲率计算

曲线——曲率 二维参考链接三维参考连接用到的补充知识&#xff1a;点乘 叉乘空间曲线的切线 二维参考链接 离散点曲率计算-三种方法 MATLAB 求取离散点的曲率最大值 ⭐求离散点的曲率&#xff08;非等间隔&#xff09; 精品&#xff1a;Spline导数及曲率计算&#xff08;判…

MATLAB----绘制三维曲面

本篇参考于&#xff1a;中国大学慕课科学计算与MATLAB统计&#xff0c;专题四“4.5三维曲面” 绘制格网meshgrid 格网和曲面surf&mesh 其他形式surfc,surfl&meshc,meshz 标准三维曲面函数sphere&cylinder 三个方程两个变量使用fsurf和fmesh 1.meshgrid函数生…

平面曲线曲率的计算-MATLAB

定义 曲率&#xff1a;曲线上某个点的切线方向角对弧长的变化率&#xff0c;表明曲线在该点的弯曲程度。设有光滑曲线 C C C&#xff08;即曲线 C C C 二阶可导&#xff09;&#xff0c;在曲线 C C C 上选定一点 M M M 作为度量的基点&#xff0c;点 M M M 对应于弧长 s…