单页应用中的路由控制
1.以往的浏览器历史跳转
在普通的通过window.location.href的跳转时实际上是直接改变了地址栏地址,对服务器发送了请求,至于
请求的文件的位置,这种路由的查找则是由服务器端完成的
2.spa单页应用的不同
之前用angular写过几个移动app,一直没有考虑过其路由的问题。因为是使用了ionic和ui-router,所以之前一直以为是ionic
实现的单页应用而不是angular
![ionic code]{ioniccode.png}
ionic实现了模板的缓存,类似栈的形式,不断将新的页面压入栈顶(class=”active”),而之前的页面(class=”cached”)则是
拥有display:none而隐藏
实际上angular的ng-route模块同ui-router一样都提供了客户端路由,使得spa应用成为可能
那么我们自己如何实现这种路由机制呢,方法有两种
1.location.hash window.onhashchange事件
优点: 兼容性好,ie8中支持
2.history.state pushState replaceState两种方法 window.popstate事件
优点:h5中引入的新特性,可以传递参数对象
如下是我实现的一个pjax小测试
基于location.hash实现的客户端路由
至于pjax,后续我会研究类似于director.js这样的路由库或者ng-route和ui-router进行更深度的分析,毕竟在实际应用中,我们不敢也不用去造轮子
那么有一个问题产生了,修改location为什么没有发生跳转呢
这就设计到锚标记的问题了
|
|
这就是a标签锚点的应用,常用于在很长的一张网页中进行导航,点击a会跳转到p的位置,可见当location
遇到#号后面的hash部分发生变化时不会跳转,而仅仅是在本页面中查找相应位置
这也是所有客户端路由库的原理,改变hash骗过浏览器的历史导航,而实际使用ajax请求模板,替换页面中的内容,这种技术成为pjax