前端路由的兩種模式:hash和history

隨著 ajax 的使用越來越廣泛,前端的頁面邏輯開始變得越來越復(fù)雜了赌,特別是spa的興起墨榄,前端路由系統(tǒng)隨之開始流行。

1.從用戶的角度看勿她,前端路由主要實現(xiàn)了兩個功能(使用ajax更新頁面狀態(tài)的情況下):

2.記錄當(dāng)前頁面的狀態(tài)(保存或分享當(dāng)前頁的url袄秩,再次打開該url時,網(wǎng)頁還是保存(分享)時的狀態(tài))逢并;可以使用瀏覽器的前進后退功能(如點擊后退按鈕之剧,可以使頁面回到使用ajax更新頁面之前的狀態(tài),url也回到之前的狀態(tài))砍聊;

作為開發(fā)者背稼,要實現(xiàn)這兩個功能,我們需要做到:

1.改變url且不讓瀏覽器向服務(wù)器發(fā)出請求玻蝌;

2.監(jiān)測 url 的變化蟹肘;

3.截獲 url 地址词疼,并解析出需要的信息來匹配路由規(guī)則。

我們路由常用hash模式和history模式實際上就是實現(xiàn)了上面的功能疆前。

hash模式

hash是指url后的#以及后面的字符寒跳。這里的#和css中的#是一個意思。hash也稱作 錨點? 本身是用作做頁面定位的竹椒,它可以讓對應(yīng)id的元素顯示在可視區(qū)域內(nèi)童太。

window.location.hash = 'qq' // 設(shè)置 url 的 hash,會在當(dāng)前url后加上 '#qq'

? ? ? ? ? ? var hash = window.location.hash // '#qq'?

? ? ? ? ? ? window.addEventListener('hashchange', function(){?

? ? ? ? ? ? 監(jiān)聽hash變化胸完,點擊瀏覽器的前進后退會觸發(fā)

? ? })

history模式

已經(jīng)有 hash 模式了书释,而且 hash 能兼容到IE8, history 只能兼容到 IE10赊窥,為什么還要搞個 history 呢爆惧?

首先,hash 本來是拿來做頁面定位的锨能,如果拿來做路由的話扯再,原來的錨點功能就不能用了。其次址遇,hash 的傳參是基于 url 的熄阻,如果要傳遞復(fù)雜的數(shù)據(jù),會有體積的限制倔约,而 history 模式不僅可以在url里放參數(shù)秃殉,還可以將數(shù)據(jù)存放在一個特定的對象中。

window.history.pushState(state, title, url)?

state:需要保存的數(shù)據(jù)浸剩,這個數(shù)據(jù)在觸發(fā)popstate事件時钾军,可以在event.state里獲取

?title:標(biāo)題,基本沒用绢要,一般傳 null

url:設(shè)定新的歷史記錄的 url吏恭。新的 url 與當(dāng)前 url 的 origin 必須是一樣的,否則會拋出錯誤重罪。url可以是絕對路徑樱哼,也可以是相對路徑。

如?在百度頁面控制臺輸出:

window.history.pushState(null, null, "https://www.baidu.com/?name=history");

地址欄會變?yōu)椋篽ttps://www.baidu.com/?name=history

執(zhí)行history.pushState(null, null, './qq/')蛆封,則變成 https://www.baidu.com/qq/

上面的例子中 改變url頁面并沒有刷新唇礁,同樣根據(jù)API所述勾栗,瀏覽器會產(chǎn)生瀏覽記錄惨篱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市围俘,隨后出現(xiàn)的幾起案子砸讳,更是在濱河造成了極大的恐慌琢融,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件簿寂,死亡現(xiàn)場離奇詭異漾抬,居然都是意外死亡,警方通過查閱死者的電腦和手機常遂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門纳令,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人克胳,你說我怎么就攤上這事平绩。” “怎么了漠另?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵捏雌,是天一觀的道長。 經(jīng)常有香客問我笆搓,道長性湿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任满败,我火速辦了婚禮肤频,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘葫录。我一直安慰自己着裹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布米同。 她就那樣靜靜地躺著骇扇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪面粮。 梳的紋絲不亂的頭發(fā)上少孝,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音熬苍,去河邊找鬼稍走。 笑死,一個胖子當(dāng)著我的面吹牛柴底,可吹牛的內(nèi)容都是我干的婿脸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼柄驻,長吁一口氣:“原來是場噩夢啊……” “哼狐树!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鸿脓,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抑钟,失蹤者是張志新(化名)和其女友劉穎涯曲,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體在塔,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡幻件,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛔溃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绰沥。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贺待,靈堂內(nèi)的尸體忽然破棺而出揪利,到底是詐尸還是另有隱情,我是刑警寧澤狠持,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布疟位,位于F島的核電站,受9級特大地震影響喘垂,放射性物質(zhì)發(fā)生泄漏甜刻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一正勒、第九天 我趴在偏房一處隱蔽的房頂上張望得院。 院中可真熱鬧,春花似錦章贞、人聲如沸祥绞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜕径。三九已至,卻和暖如春败京,著一層夾襖步出監(jiān)牢的瞬間兜喻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工赡麦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留朴皆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓泛粹,卻偏偏與公主長得像遂铡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子晶姊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355