换页之后,我的按钮全失灵了

给网站加上客户端路由后,主题切换、星空背景、入场动画在站内跳转之后集体失效。记录一次从现象到根因的排查。

为了让站内跳转更快一点,我给网站加了客户端路由。加完之后首页一切正常,我还挺满意。

直到某次随手点了「关于我」再点回首页 —— 星空背景整片消失了。

现象比想象中严重

我一开始以为只是星空的问题,多试了几次才发现不止:

  • 明暗切换按钮点了没反应
  • 首屏那句引语不再逐字打出来
  • 滚动时的入场动画只在首屏生效,换页后就没了
  • 点头像的晃动反馈也没了

但诡异的是,有的功能又好好的 —— 联系页的复制邮箱能用,导航页的搜索也能用。

这种「有的坏有的不坏」最让人头疼,因为它看起来毫无规律。

弯路

我第一反应是事件绑定被清掉了。毕竟换页的时候 DOM 会被替换,绑在旧节点上的监听自然就没了。

顺着这个思路查了半天,越查越觉得不对:如果绑定全丢了,那应该全都失效才对,为什么偏偏有些还好用?

根因

翻到框架的脚本处理逻辑才明白 —— 换页时框架会跳过那些内容已经执行过的脚本

关键在于:它判断的依据是脚本内容本身,而不是「这是哪个页面的脚本」。

于是就出现了那个看似随机的现象:

  • 页眉、页脚里的组件脚本,每个页面都长一样 → 被判定为已执行,跳过
  • 只在某一个页面出现的脚本 → 内容是新的,正常执行

所以「谁坏谁不坏」其实有规律:在各个页面之间共享的脚本全军覆没,页面独有的反而幸免

修法

思路很简单:既然不能指望脚本重新执行,那就让它在每次换页后自己再跑一遍。

框架提供了专门的事件,在首屏加载和每次换页后都会触发。把初始化逻辑挂上去就行,不用再区分「是不是第一次加载」。

顺手还修了另一个隐患:观察器如果不在换页前断开,会一直引用着被移除的节点,时间久了就是内存泄漏。

一点感想

这次踩坑让我重新想了一遍「渐进增强」。

原来我的入场动画是这么写的:元素默认透明,靠脚本把它显示出来。这意味着脚本一旦没跑起来,内容就永远看不见了

正确做法应该反过来:内容默认就是可见的,脚本只负责「加个动画让它更好看」。

这样即使脚本挂了、用户的浏览器禁用了 JavaScript、或者干脆加载失败,页面上该看到的字还是在那儿。

装饰性的东西不该成为内容可见的前提。


(这篇是我的真实排查记录,你可以按自己的经历改写 —— 尤其是「弯路」那节,换成你当时真实的想法会更生动。)

← 回到文章列表

音乐

曲目筹备中

0:00 / 0:00
2

播放列表