当前位置: 首页 > news >正文

自己搓一个网页路由管理

实现流程

在<body>中动态添加<f-body>元素, 只显示(style.display)最上方的一个<f-body>

index.html

<!doctype html>
<html lang="zh-cn">
<head><meta charset="UTF-8" /><title>Awesome Capacitor App</title><meta name="viewport"content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" /><meta name="format-detection" content="telephone=no" /><meta name="msapplication-tap-highlight" content="no" /><link rel="icon" type="image/x-icon" href="./assets/icon/favicon.ico" /><link rel="png" type="image/png" href="./assets/imgs/logo.png" /><link rel="manifest" href="./manifest.json" /><link rel="stylesheet" href="./css/style.css" /><meta name="theme-color" content="#31d53d" />
</head><body></body>
<script src="./js/index.js" type="module"></script>
</html>

index.js

/**伪页面历史记录管理类 更新时会访问 fbody.fupdate 函数* 调用push(bodyID)加载新页面* 调用pop()返回上一个f-body*/
class PageHistory {data = []push(bodyID) {if (this.data.length > 1) this.data[this.data.length - 1].scrollY = document.documentElement.scrollTop;let res = this.data.push({bodyID: bodyID,scrollY: 0,});console.log("添加伪页面历史:" + bodyID);document.documentElement.scrollTop = 0;this.updatePage();return res;}pop() {if (this.data.length == 0) return;let res = this.data.pop();let ele = document.querySelector("body>f-body#" + res.bodyID);ele?.remove();  // 真正释放内存console.log("删除伪页面历史:" + res.bodyID);this.updatePage();}updatePage() {for (let i = 0; i < this.data.length; i++) {const element = this.data[i];let qbody = document.querySelector('body>f-body#' + element.bodyID);if (!qbody) {console.log("伪页面历史<" + element.bodyID + ">因元素不存在而被删除");this.data.splice(i, 1);i--;continue;}qbody.style.display = "none";}if (this.data.length >= 1) {let history_item = this.data[this.data.length - 1];let qbody = document.querySelector('body>f-body#' + history_item.bodyID);qbody.style.display = "";if(qbody.fupdate) qbody.fupdate();document.documentElement.scrollTop = history_item.scrollY;}}
}
// 暴露pageHistory到主window下
window.pageHistory = new PageHistory();/**加载伪页面文件(位置: ./fakepage/xxx.html)并构建为shadow-root, 隔离css和js环境* 加载文件并构建带有唯一ID的<f-body>元素, 然后加入到document.body下  * 自动记录伪页面历史  * 自动执行fname文件中<script class="script">元素中的代码  * @param {string} fname 文件名称, 不带路径* @param {string} pageID 唯一页面id, 作为伪页面历史的标识* @param {*} data 附加到 shadow-root.data 上的数据, 可为空* @returns shadow-root: 加载的dom元素(shadow-root)*/
async function loadFakePage(fname, pageID, data) {pageID = pageID + "-" + (new Date() - 0);// if (document.querySelector('body>f-body#' + pageID) !== null) {//   console.error("页面ID<" + pageID + ">已存在!");// }const ele = document.createElement('f-body');ele.id = "" + pageID;const res = ele.attachShadow({ mode: 'open' });res.data = data;let resp = await ((await fetch('./fakepage/' + fname)).text());res.innerHTML = resp;document.body.appendChild(ele);pageHistory.push(pageID);const pageScript = res.querySelector('script.script')?.innerText;if (pageScript) (new Function('fbody', pageScript))(res);return res;
}

示例 fakepage

<style>:host {width: 100vw;user-select: none;text-align: center;&>h1 {font-size: 4em;}&>button {font-size: 2em;margin: 5vw;width: 90vw;}}
</style>
<h1>主页面</h1>
<button class="enter">测试按钮</button>
<script class="script">function pageLoad() {let btn = document.createElement('button');btn.innerText = "testing";btn.onclick = () => {fbody.querySelector('h1').innerText = "测试中...";btn.disabled = true;setTimeout(() => {loadFakePage('home.html', 'home');}, 1000);};};pageLoad();
</script>
http://www.gsyq.cn/news/1562462.html

相关文章:

  • 阜阳家长必看!2026安徽正规全封闭戒网瘾学校名单 - 辛云教育资讯
  • 长途托运摩托车哪家更稳妥?四大整合快运渠道安全、运费、时效、上门服务全方位对比 - 时讯资讯
  • 2026年6月最新芝柏中国官方售后电话网点地址及客户服务热线 - 亨得利官方服务中心
  • SERP API + LangChain:10 行代码做实时搜索 Agent 背景
  • 孩子叛逆厌学、沉迷手机?黄山 2026 十大戒网瘾特训学校权威榜单,正规封闭军事化,帮娃迷途知返! - 辛云教育资讯
  • ANSYS Workbench循环对称分析实战:从Cyclic Region到Pre-Meshed的避坑指南
  • 北京平谷刑事律所推荐:如何筛选合适刑事辩护律师团队 - 品牌2026
  • 2026扬州最靠谱汽车贴膜店,性价比高到离谱! - 资讯速览
  • 如何轻松退出Windows预览版:OfflineInsiderEnroll终极解决方案指南
  • 2026年陕西商洛叛逆青少年管教学校十大“实力派”榜单出炉! - 辛云教育资讯
  • 5分钟掌握B站视频下载:新手也能轻松获取4K大会员专属内容
  • 装修小白适合积木家装修吗?看懂报价、材料和合同再决定 - 资讯速览
  • 从FAB工艺到IC验证:一位材料人的跨界转型实战录
  • 上班族选积木家装修省心吗?全包整装和节点验收怎么配合 - 资讯速览
  • 电瓶车跨省托运2026避坑指南 新手必看防坑技巧 - 快递物流资讯
  • Windows 11任务栏歌词插件:让音乐歌词融入你的工作流
  • 轻量级AI工作流中枢:OpenClaw本地部署直连钉钉实战指南
  • 河源酒吧哪家靠谱不踩坑?消费避坑全攻略,综合首选荔枝酒馆 Liz Tavern - 资讯速览
  • 2026年北京10所叛逆孩子封闭管教学校权威甄选!别让你的“病”,让孩子吃药 - 辛云教育资讯
  • 目标探测和密码探索实验里,那些提问
  • 手推小型扫地机排行榜2025:谁才是真正王者? - 工业清洁测评社
  • 深度解析木纹砖:核心特性、对比分析与应用指南 - 资讯速览
  • 英语阅读_the best things in life are free
  • 杭州市家电维修 / 家电清洗|本地避坑指南,满分五星平台 | 首选一步到家 - 一步到家
  • ThinkPad风扇控制终极指南:用TPFanCtrl2实现智能散热与极致静音
  • 2026年6月最新积家中国官方售后服务电话网点及客服中心地址 - 亨得利官方服务中心
  • Windows风扇智能控制终极指南:5分钟掌握FanControl完整教程
  • Pikachu靶场Token防爆破绕过与暴力破解实验报告
  • 嵌入式AI开发实战:EAIDK610 Linux环境搭建与核心操作指南
  • 从零开始理解ISP:自动曝光(AE)的核心原理与实战调优