關於前后端分離后的路由控制問題


路由控制在多數框架中均有專門的方法,比如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框架,那么路由控制全由后台來掌控,就沒那么多事了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM