欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

[轉(zhuǎn)帖]路由的兩種模式:hash模式和 history模式

freeflydom
2023年5月30日 9:5 本文熱度 620


為什么要使用路由

現(xiàn)在的網(wǎng)絡(luò)應(yīng)用程序越來(lái)越多的使用AJAX異步請(qǐng)求完成頁(yè)面的無(wú)縫刷新,導(dǎo)致瀏覽器的URL不會(huì)發(fā)生任何變化而完成了請(qǐng)求,從而破換了用戶瀏覽體驗(yàn)。同時(shí)本次瀏覽的頁(yè)面內(nèi)容在用戶下次使用URL訪問(wèn)時(shí)將無(wú)法重新呈現(xiàn),使用路由可以很好地解決這個(gè)問(wèn)題。

單頁(yè)面應(yīng)用利用了Javascript動(dòng)態(tài)變換網(wǎng)頁(yè)內(nèi)容,避免了頁(yè)面重載;路由則提供了瀏覽器地址變化,網(wǎng)頁(yè)內(nèi)容也跟隨變化,兩者結(jié)合起來(lái)則為我們提供了體驗(yàn)良好的單頁(yè)面web應(yīng)用。

前端路由實(shí)現(xiàn)方式

路由需要實(shí)現(xiàn)三個(gè)功能:

  1. 當(dāng)瀏覽器地址變化時(shí),切換頁(yè)面;

  2. 點(diǎn)擊瀏覽器【后退】、【前進(jìn)】按鈕,網(wǎng)頁(yè)內(nèi)容跟隨變化;

  3. 刷新瀏覽器,網(wǎng)頁(yè)加載當(dāng)前路由對(duì)應(yīng)內(nèi)容;

在單頁(yè)面web網(wǎng)頁(yè)中, 單純的瀏覽器地址改變, 網(wǎng)頁(yè)不會(huì)重載,如單純的hash網(wǎng)址改變網(wǎng)頁(yè)不會(huì)變化,因此我們的路由主要是通過(guò)監(jiān)聽(tīng)事件,并利用js實(shí)現(xiàn)動(dòng)態(tài)改變網(wǎng)頁(yè)內(nèi)容,有兩種實(shí)現(xiàn)方式:

  1. hash模式:監(jiān)聽(tīng)瀏覽器地址hash值變化,執(zhí)行相應(yīng)的js切換網(wǎng)頁(yè);

  2. history模式:利用history API實(shí)現(xiàn)url地址改變,網(wǎng)頁(yè)內(nèi)容改變;

它們的區(qū)別最明顯的就是hash會(huì)在瀏覽器地址后面增加#號(hào),而history可以自定義地址。

hash模式

使用window.location.hash屬性及窗口的onhashchange事件,可以實(shí)現(xiàn)監(jiān)聽(tīng)瀏覽器地址hash值變化,執(zhí)行相應(yīng)的js切換網(wǎng)頁(yè)。下面具體介紹幾個(gè)使用過(guò)程中必須理解的要點(diǎn):

  • hash指的是地址中#號(hào)以及后面的字符,也稱為散列值。hash也稱作錨點(diǎn),本身是用來(lái)做頁(yè)面跳轉(zhuǎn)定位的。如http://localhost/index.html#abc,這里的#abc就是hash;

  • 散列值是不會(huì)隨請(qǐng)求發(fā)送到服務(wù)器端的,所以改變hash,不會(huì)重新加載頁(yè)面;

  • 監(jiān)聽(tīng) window 的 hashchange 事件,當(dāng)散列值改變時(shí),可以通過(guò) location.hash 來(lái)獲取和設(shè)置hash值;

  • location.hash值的變化會(huì)直接反應(yīng)到瀏覽器地址欄;

觸發(fā)hashchange事件的幾種情況

瀏覽器地址欄散列值的變化(包括瀏覽器的前進(jìn)、后退)會(huì)觸發(fā)window.location.hash值的變化,從而觸發(fā)onhashchange事件;

當(dāng)瀏覽器地址欄中URL包含哈希如 www.baidu.com/#home,這時(shí)按下輸入,瀏覽器發(fā)送www.baidu.com/,請(qǐng)求至服務(wù)器,請(qǐng)求完畢之后設(shè)置散列值為#home,進(jìn)而觸發(fā)onhashchange事件。

當(dāng)只改變?yōu)g覽器地址欄URL的哈希部分,這時(shí)按下回車(chē),瀏覽器不會(huì)發(fā)送任何請(qǐng)求至服務(wù)器,這時(shí)發(fā)生的只是設(shè)置散列值新修改的哈希值,并觸發(fā)onhashchange事件;

html中<a>標(biāo)簽的屬性 href 可以設(shè)置為頁(yè)面的元素ID如 #top,當(dāng)點(diǎn)擊該鏈接時(shí)頁(yè)面跳轉(zhuǎn)至該id元素所在區(qū)域,同時(shí)瀏覽器自動(dòng)設(shè)置 window.location.hash 屬性,地址欄中的哈希值也會(huì)發(fā)生改變,并觸發(fā)onhashchange事件;

//設(shè)置 url 的 hash,會(huì)在當(dāng)前url后加上'#abc'

window.location.hash='abc';

let hash = window.location.hash //'#abc'


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

    //監(jiān)聽(tīng)hash變化,點(diǎn)擊瀏覽器的前進(jìn)后退會(huì)觸發(fā)

})

history模式

概述

window.history 屬性指向 History 對(duì)象,它表示當(dāng)前窗口的瀏覽歷史。當(dāng)發(fā)生改變時(shí),只會(huì)改變頁(yè)面的路徑,不會(huì)刷新頁(yè)面。 History 對(duì)象保存了當(dāng)前窗口訪問(wèn)過(guò)的所有頁(yè)面網(wǎng)址。通過(guò) history.length 可以得出當(dāng)前窗口一共訪問(wèn)過(guò)幾個(gè)網(wǎng)址。 由于安全原因,瀏覽器不允許腳本讀取這些地址,但是允許在地址之間導(dǎo)航。 瀏覽器工具欄的“前進(jìn)”和“后退”按鈕,其實(shí)就是對(duì) History 對(duì)象進(jìn)行操作。

屬性

History 對(duì)象主要有兩個(gè)屬性。

  • History.length:當(dāng)前窗口訪問(wèn)過(guò)的網(wǎng)址數(shù)量(包括當(dāng)前網(wǎng)頁(yè))

  • History.state:History 堆棧最上層的狀態(tài)值(詳見(jiàn)下文)

// 當(dāng)前窗口訪問(wèn)過(guò)多少個(gè)網(wǎng)頁(yè)

history.length // 1


// History 對(duì)象的當(dāng)前狀態(tài)

// 通常是 undefined,即未設(shè)置


history.state // undefined

方法

History.back()、History.forward()、History.go(),這三個(gè)方法用于在歷史之中移動(dòng)。

  • History.back():移動(dòng)到上一個(gè)網(wǎng)址,等同于點(diǎn)擊瀏覽器的后退鍵。對(duì)于第一個(gè)訪問(wèn)的網(wǎng)址,該方法無(wú)效果。

  • History.forward():移動(dòng)到下一個(gè)網(wǎng)址,等同于點(diǎn)擊瀏覽器的前進(jìn)鍵。對(duì)于最后一個(gè)訪問(wèn)的網(wǎng)址,該方法無(wú)效果。

  • History.go():接受一個(gè)整數(shù)作為參數(shù),以當(dāng)前網(wǎng)址為基準(zhǔn),移動(dòng)到參數(shù)指定的網(wǎng)址。如果參數(shù)超過(guò)實(shí)際存在的網(wǎng)址范圍,該方法無(wú)效果;如果不指定參數(shù),默認(rèn)參數(shù)為0,相當(dāng)于刷新當(dāng)前頁(yè)面。

history.back();

history.forward();

history.go(1);//相當(dāng)于history.forward()

history.go(-1);//相當(dāng)于history.back()

history.go(0); // 刷新當(dāng)前頁(yè)面

注意:移動(dòng)到以前訪問(wèn)過(guò)的頁(yè)面時(shí),頁(yè)面通常是從瀏覽器緩存之中加載,而不是重新要求服務(wù)器發(fā)送新的網(wǎng)頁(yè)。

History.pushState()

該方法用于在歷史中添加一條記錄。pushState()方法不會(huì)觸發(fā)頁(yè)面刷新,只是導(dǎo)致 History 對(duì)象發(fā)生變化,地址欄會(huì)有變化。

語(yǔ)法:history.pushState(object, title, url)

該方法接受三個(gè)參數(shù),依次為:

  • object:是一個(gè)對(duì)象,通過(guò) pushState 方法可以將該對(duì)象內(nèi)容傳遞到新頁(yè)面中。如果不需要這個(gè)對(duì)象,此處可以填 null。

  • title:指標(biāo)題,幾乎沒(méi)有瀏覽器支持該參數(shù),傳一個(gè)空字符串比較安全。

  • url:新的網(wǎng)址,必須與當(dāng)前頁(yè)面處在同一個(gè)域。不指定的話則為當(dāng)前的路徑,如果設(shè)置了一個(gè)跨域網(wǎng)址,則會(huì)報(bào)錯(cuò)。

var data = { foo: 'bar' };

history.pushState(data, '', '2.html');

console.log(history.state) // {foo: "bar"}

注意:如果 pushState 的 URL 參數(shù)設(shè)置了一個(gè)新的錨點(diǎn)值(即 hash),并不會(huì)觸發(fā) hashchange 事件。反過(guò)來(lái),如果 URL 的錨點(diǎn)值變了,則會(huì)在 History 對(duì)象創(chuàng)建一條瀏覽記錄。

如果 pushState() 方法設(shè)置了一個(gè)跨域網(wǎng)址,則會(huì)報(bào)錯(cuò)。

// 報(bào)錯(cuò)

// 當(dāng)前網(wǎng)址為 http://example.com

history.pushState(null, '', 'https://twitter.com/hello');

上面代碼中,pushState 想要插入一個(gè)跨域的網(wǎng)址,導(dǎo)致報(bào)錯(cuò)。這樣設(shè)計(jì)的目的是,防止惡意代碼讓用戶以為他們是在另一個(gè)網(wǎng)站上,因?yàn)檫@個(gè)方法不會(huì)導(dǎo)致頁(yè)面跳轉(zhuǎn)。

History.replaceState()

該方法用來(lái)修改 History 對(duì)象的當(dāng)前記錄,用法與 pushState() 方法一樣。

假定當(dāng)前網(wǎng)頁(yè)是 example.com/example.htm…

history.pushState({page: 1}, '', '?page=1')

// URL 顯示為 http://example.com/example.html?page=1


history.pushState({page: 2}, '', '?page=2');

// URL 顯示為 http://example.com/example.html?page=2


history.replaceState({page: 3}, '', '?page=3');

// URL 顯示為 http://example.com/example.html?page=3


history.back()

// URL 顯示為 http://example.com/example.html?page=1


history.back()

// URL 顯示為 http://example.com/example.html


history.go(2)

// URL 顯示為 http://example.com/example.html?page=3

popstate 事件

每當(dāng) history 對(duì)象出現(xiàn)變化時(shí),就會(huì)觸發(fā) popstate 事件。

注意:

  • 僅僅調(diào)用pushState()方法或replaceState()方法 ,并不會(huì)觸發(fā)該事件;

  • 只有用戶點(diǎn)擊瀏覽器倒退按鈕和前進(jìn)按鈕,或者使用 Javascript 調(diào)用History.back()、 History.forward()、History.go()方法時(shí)才會(huì)觸發(fā)。

  • 另外,該事件只針對(duì)同一個(gè)文檔,如果瀏覽歷史的切換,導(dǎo)致加載不同的文檔,該事件也不會(huì)觸發(fā)。

  • 頁(yè)面第一次加載的時(shí)候,瀏覽器不會(huì)觸發(fā)popstate事件。

使用的時(shí)候,可以為popstate事件指定回調(diào)函數(shù),回調(diào)函數(shù)的參數(shù)是一個(gè) event 事件對(duì)象,它的 state 屬性指向當(dāng)前的 state 對(duì)象。

window.addEventListener('popstate', function(e) {

    //e.state 相當(dāng)于 history.state

    console.log('state: ' + JSON.stringify(e.state));

    console.log(history.state);

});

通過(guò)history.pushState 實(shí)現(xiàn)頁(yè)面 tab 切換的功能。

history 致命的缺點(diǎn)就是當(dāng)改變頁(yè)面地址后,強(qiáng)制刷新瀏覽器時(shí),(如果后端沒(méi)有做準(zhǔn)備的話)會(huì)報(bào)錯(cuò),因?yàn)樗⑿率悄卯?dāng)前地址去請(qǐng)求服務(wù)器的,如果服務(wù)器中沒(méi)有相應(yīng)的響應(yīng),會(huì)出現(xiàn) 404 頁(yè)面。


——————————————————

https://juejin.cn/post/7236563012533878821



該文章在 2023/5/30 9:08:08 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved