Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

pushState 缺个事件

  在 History API 中只有 popstate 事件,它会在浏览器后退时触发。pushState 这个方法被调用时不会触发 popstate。那么问题来了,当我们要实现一个全局 URL 监控时要怎么做?我觉得 pushState 的设计应该添加一个事件才对,否则我们只能用各种黑魔法来勉强实现。
  第一种方式是添加一个全局的计时器,扫描当前 URL 的值。这个方法有很多问题,首先全局计时器是个非常脏而且耗资源的东西。而且如果时间间隔设置太长又会导致监听不及时等问题。虽然勉强能实现,但这终究是个很烂的方案。
  另一种方法是劫持原生的 pushState。先在一个闭包中保存原生的 pushState 方法,然后覆写 History.pushState。当这个伪造的 pushState 方法被调用时主动触发一个事件,然后再去调用真正的 pushState。用这样钩子的方式确实可以解决 pushState 缺事件的问题,但「劫持」这件事本身也是非常黑的,如果框架内的代码太风骚可能会带来一些奇奇怪怪的问题。不过和计时器比起来,劫持 pushState 确实是比较好的办法。
  最好再强调另一个问题,我并不喜欢 History API!如果可以不考虑 SEO 问题,我可能完全使用 URL Hash 来做前端路由。因为 URL Hash 的所有页面不仅可以共享 http 缓存,使页面首屏加载更快。而且 hashchange 这个事件是从 IE8 时代就开始支持的。这样就可以在毫无黑魔法的情况下完美监控页面 URL 变化。但是这只是理想状态,因为不考虑 SEO 是几乎不可能的。或者从另一个角度看,要是度娘像谷歌一样支持 URL 中的 #! 语法就天下太平了。
网名:
34.203.213.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^