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为什么没有发生跳转呢

这就设计到锚标记的问题了

1
2
<a href="#point"></a>
<p id='point'></p>

这就是a标签锚点的应用,常用于在很长的一张网页中进行导航,点击a会跳转到p的位置,可见当location
遇到#号后面的hash部分发生变化时不会跳转,而仅仅是在本页面中查找相应位置

这也是所有客户端路由库的原理,改变hash骗过浏览器的历史导航,而实际使用ajax请求模板,替换页面中的内容,这种技术成为pjax