实现一个页面操作不会整页刷新的网站,并且能在浏览器前进、后退时正确响应。给出你的技术实现方案
分析:
页面操作不会整页刷新:正常情况下,点击浏览器的前进后退按钮页面会重新请求(刷新按钮转圈圈~),但有时是不需要每次都重新请求的,题目的意思应该是优化一下,减少请求
第一种方式:通过锚点操作url的hash值
1、页面中设置锚点,在点击锚点时页面不会刷新,但此时hash值是会发生变化的,我们可以对hash进行监听,然后根据不同的值渲染不同的内容。此时点击前进后退按钮就不会造成页面的刷新(刷新按钮不动)
2、代码:
<a href="#/home">首页</a> <a href="#/about">关于</a> <hr /> <h1 id="app">内容:default</h1> <script> const app = document.querySelector('#app') const handle = () => { switch (location.hash) { case '#/home': app.innerHTML = '内容:HOME' break case '#/about': app.innerHTML = '内容:ABOUT' break default: app.innerHTML = '内容:default' } } window.addEventListener('hashchange', handle) </script>
3、效果:
①初始状态
②点击【首页】,hash值变化了,同时页面更新
③点击【关于】,hash值为【#/about】,页面更新
④此时点击浏览器的前进后退按钮,页面不会整页刷新(刷新按钮不动),页面内容会随着hash值的变化而变化
4、优缺点
优点:兼容性好,老版本的IE也可以运行
缺点:存在#,url地址看起来不真实
第二种方式:H5的history方法
https://blog.csdn.net/weixin_47450807/article/details/122993140
<!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> <a href="#/home">首页</a> <a href="#/about">关于</a> <a href="#/more">更多</a> <hr /> <h1 id="app">内容:default</h1> <script> const app = document.querySelector('#app') const aAll = document.querySelectorAll('a') for (let item of aAll) { item.addEventListener('click', (e) => { e.preventDefault() const href = item.getAttribute('href') console.log('href', href) history.pushState({}, '', href) historyChange() }) } window.addEventListener('popstate', () => { historyChange() }) function historyChange() { console.log(location.pathname) switch (location.pathname) { case '/home': app.innerHTML = '内容:HOME' break case '/about': app.innerHTML = '内容:ABOUT' break case '/more': app.innerHTML = '内容:MORE' break default: app.innerHTML = '内容:default' break } } // const handle = () => { // switch (location.hash) { // case '#/home': // app.innerHTML = '内容:HOME' // break // case '#/about': // app.innerHTML = '内容:ABOUT' // break // default: // app.innerHTML = '内容:default' // } // } // window.addEventListener('hashchange', handle) </script> </body> </html>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2020-02-26 vue-day07&day08----路由、路由常用的配置项、vue路由的内置组件、vue路由跳转的方式、路由传值、路由解耦(路由传值的一种方式)、编程式导航、嵌套路由children、路由元信息meta、路由生命周期(路由守卫)、路由懒加载、vue/cli、webpack配置alias、vue/cli中配置alias、vue-router底层原理、单页面开发的缺点、路由报错