我们在开发网页时,经常会遇到一种情况——在一个页面对页面初始状态进行了修改(如已请求到的数据、表单数据、滚动高度等等),跳转到另外一个页面之后再返回到原页面(路由回退),原页面需要保持原先的状态不变。但如果不做额外处理,往往会出现原页面历史状态丢失、被重置为初始状态的情况。
这种情况常见会出现在 SPA 中,因为 SPA 是使用单页来模拟多页,页面跳转时并没有请求一个新的页面应用,所以 SPA 在路由跳转时会丢失历史页面的普通状态。
是否在 MPA 中就不会出现这种情况了呢?也不尽其然。
在多年以前,互联网上全都是些简单的 MPA 应用,一个页面就是一个 html 文件,一个网站就是一组 html。而一个页面的所有数据,就都在这个 html 文件(或者其他资源文件)中,在浏览器获取到 html 等资源文件的时候,也就随之获取到了数据。这种情况下,不会出现路由跳转导致丢失数据的情况,而滚动高度会被浏览器保存,所以只有一些表单等用户输入的信息会丢失。
但是,随着前端技术的发展和潮流的变化,更多复杂的情况出现了,比如无限下拉滚动加载数据,比如 h5 移动端常见的数据使用 ajax 加载,带来了更多的变化。
数据使用 ajax 加载,意味着数据与 html 的完全解耦。这种情况下,即使是 MPA ,也会出现路由跳转导致数据丢失的情况。
因为这种情况在移动端很常见,部分 Android 浏览器与大多数 IOS 浏览器针对这一现象做了额外的优化,在路由跳转后仍保留原页面资源,这样就避免了路由跳转导致原页面数据丢失。
各种 PC 端浏览器历史悠久,基本都没有做额外优化,只会保存滚动高度。
但是对于这种情况,参考主流网站与用户习惯,页面往往不会直接跳转(window.location.href),而是打开新的标签页(window.open),这样问题就不存在了。
上面也提到了,部分 Android 浏览器与大多数 IOS 浏览器针对这一现象做了额外的优化,在路由跳转后仍保留原页面资源