背景:

  单页 Web 应用 (single-page application 简称为 SPA) 是一种特殊的 Web 应用,它将所有的活动均局限于一个Web页面中;这就表示Web应用被加载出来之后,Web中所有的交互和跳转均不会与服务器发生交互,而是使用JS转换HTML中的内容。

 

实现的原理:

  1. 使用 hashchange 可以检测路由的变化情况

  2. 使用 location.hash 路由,然后根据路由选择需要渲染的页面内容

 

SPA Demo:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>SPA Demo</title>
 6     <style>
 7         .box {
 8             width: 300px;
 9             height: 300px;
10             background: lightyellow;
11             margin: 0 auto;
12         }
13         .content {
14             width: 100%;
15             height: 100%;
16         }
17     </style>
18 </head>
19 <body>
20     <div class="box">
21         <div class="content"></div>
22         <button>下一页</button>
23     </div>
24     <script>
25         const renderHtml = (text) => {
26             let element = document.querySelector('.content')
27             element.innerHTML = text
28         }
29         const responseForPath = (path) => {
30             let mapper = {
31                 '/0': `<h3>第一个界面</h3>`,
32                 '/1': `<h3>第二个界面</h3>`,
33                 '/2': `<h3>第三个界面</h3>`,
34                 '/3': `<h3>第四个界面</h3>`,
35             }
36             if (path in mapper) {
37                 return mapper[path]
38             } else {
39                 return 'not found'
40             }
41         }
42         // 获取当前的路由,然后根据路由选择需要渲染的内容
43         const render = () => {
44             console.log(location.hash)
45             // 根据路由选择相应的内容
46             let r = responseForPath(location.hash.slice(1))
47             // 渲染内容
48             renderHtml(r)
49         }
50         const bindEvents = () => {
51             // 给当前窗口绑定 hashchange 事件
52             window.addEventListener('hashchange', (event) => {
53                 render()
54             })
55         }
56         // 给按钮绑定事件,实现页面路由的更换
57         const buttonBindEvent = () => {
58             let ele = document.querySelector('button')
59             ele.addEventListener('click', (event) => {
60                 let x = location.hash
61                 // console.log(x)
62                 if (x === '') {
63                     location.hash = '/0'
64                 } else {
65                     console.log(x)
66                     let temp = x.slice(2)
67                     console.log(temp)
68                     temp = (Number(temp) + 1) % 4
69                     location.hash = `/${temp}`
70                 }
71             })
72         }
73         const __main = () => {
74             bindEvents()
75             render()
76             buttonBindEvent()
77         }
78         
79         // DOMContentLoaded 事件表示 HTML 已经加载(渲染)到页面中, 这个时候操作 DOM 元素就没有问题
80         document.addEventListener('DOMContentLoaded', () => {
81             __main()
82         })
83     </script>
84 </body>
85 </html>

 

参考资料:

  1.  如何快速开发SPA应用:https://www.cnblogs.com/constantince/p/5586851.html