路由控制在多數框架中均有專門的方法,比如ng和node。但是只會使用是不可以的,雖然我連使用都不會。研究它的實現方式,才是正經道路,因為無論框架中的方式都炫酷或者實用,都是從底層開發出來了,那么底層的方法,就是需要了解研究的方法。依此,在以后的使用或者是自定義的時候才能夠如臂使指。
那么前端的路由控制總歸來說是有兩種方法的。
第一種是H5新增的一類API,history。首先來看一下它的諸多方法。
//與瀏覽器后退按鈕作用相同 window.history.back(); //跳轉到 window.history.go(number); number == -1 時與back作用相同 //與瀏覽器前進按鈕作用相同 window.history.forward(); //向瀏覽器歷史棧中添加一條歷史記錄 window.history.pushState(data, title, url); //修改當前歷史記錄 window.history.replaceState(data, title, url);
//同頁面不刷新跳轉時觸發事件
window.onpopstate()
這種方法支持IE9以上(不包括IE9)及其余瀏覽器,data數據最多可以存儲640KB。並且可以根據自己需要定義url的樣式,一般情況下默認使用#、#!和?作為分隔,當然也可以使用其他,甚至“/”。
第二種方法,window.location.hash。
這種方法支持IE7以上及其余所有瀏覽器,不包括IE7。它是以#作為前端路由的分隔的。
同樣的,也有跳轉觸發事件,onhashchange
如下是兼容情況。(mark到的)
history&&history.pushState兼容如下: chrome true; Firefox true; IE10 true; IE<=9 false; PS:ie<=9既然不支持這些api那就只能采用hash方案,來實現路由系統的兼容了。 hashchange兼容如下: IE9 true; IE8 true; IE7 false; ... 頁面load時,onhashchange默認觸發情況: chrome 需主動trigger才能觸發 FF 需主動trigger才能觸發 IE 需主動trigger才能觸發 頁面load時,onpopstate默認觸發情況: chrome <34版本之前的默認觸發 FF 默認不觸發 IE 默認不觸發 PS:以上是我手動測試的一個大概情況,具體的兼容情況可以去這里測試(http://caniuse.com/)。
而作為IE6、7的話就要使用setIntval()來偵聽url的變化了。
那么作為分隔,#之后的內容是並不為ajax抓取的。
例如
//使用ajax,url=http://qq.com/index.html#444 //那么其實是ajax的請求地址是 http://qq.com/index.html
那么其實路由控制就是這樣的原理而已。
如果使用h5的api的話需要和后台進行規范約定,約定哪些是前端來做路由控制,哪些由后台來做。
當然也可以兩種方式結合起來,這樣來做到一個兼容性。噢。不!是三種結合,萬一。。。對不對。
總結如下
H5+hash方案:兼容所以瀏覽器,又照顧到了高級瀏覽器應用新特性。 純H5方案:表示IE是誰,我不認識-_-",這套方案應用純H5的新特性,URL隨心定制。 純Hash方案:其實一開始我是拒絕的,可是...可是...duang...IE~~:)
那么這就是底層的實現方法了,至於ng和node等框架中如何來做路由控制我還沒接觸,最近的項目使用的是springMVC框架,那么路由控制全由后台來掌控,就沒那么多事了。