为了提高页面跳转时加载速度,pjax、turbo drive(turbolink)等js库实现了前端基于ajax与pushState的局部跳转功能。
它们通过发出ajax请求,获取指定的html文档,并将其有用部分“移花接木”至当前页面;并使用pushState修改导航历史与url。
这样有以下两个好处:
好处是有,但比较有限。
如前所述,这个做法是为了提高跳转速度。
网页加载速度的最大瓶颈在于:向服务器获取资源。
局部跳转因为利用了原页面已有资源,因此可以减少向服务器发起重复请求,从而提升加载速度。
但是涅!目前的主流浏览器都是有缓存机制的(除非你的用户故意点了控制台中的Disable Cache搞你心态)。也就是:虽然全局跳转会再次加载资源,但是在发起请求前,会先试图在本地查找已有的缓存文件。即同样不会向服务器发起重复请求,而且缓存命中仅需花费数毫秒。
局部跳转随之带来的,还有节省了脚本重新执行的时间。但相比于网络连接时间,省去执行脚本的几毫秒真的算不上什么新引人的特点。(它甚至引发了下文所说的“缺陷”)
局部跳转并没有为你带来多大好处,但如果它也没有给你副作用,不妨一试。
局部跳转根本就不算是跳转,而是利用ajax请求与pushstate技术模拟而来的结果。
最大的问题在于:
因为页面没有实际上刷新挑战。文档在第一次完成加载后,这些函数就已被触发;在随后的局部载入时,只做了内容替换,而没有真的跳转。因此没有生命周期函数,也没有清空/更新js中旧的HTML变量
但它们本也可以利用一些技巧主动模拟这些操作,但没有一个局部跳转脚本这么做,因为:
换言之,无论是重新触发,还是不再触发,其实都并不完美。而且重新触发还需要做额外功夫,所以没人愿意做这种吃力不讨好的事。
局部跳转库一般都自带自己的生命周期函数。对于自己写的脚本,应该避免使用默认的生命周期函数,而使用它们提供的回调。
不要在js中用变量缓存html元素
我们无法修改第三方库的代码,但对于用到的库,可以:
哈哈,这就是我想说的。如果你的站点需要支持用户自定义插件(即难免引入未知的第三方js脚本。说的就是你,WordPress),你就无法进行针对性的处理;而且也不存在一个通用性的解决办法。
所以,你无法阻止这些错误。你唯一的选择就是,关闭局部加载,让浏览器照常刷新。因为所有js脚本的开发都是针对浏览器一般环境的,因此这些脚本都会按预期的行为执行,也就不会出现问题。