理解瀏覽器的歷史記錄
這是一篇基礎文章,講述一些瀏覽器裡面歷史記錄棧管理的相關內容。寫這篇的起因,源自於我最近想研究pushState,看看用它來實現SPA會遇到哪些問題,而pushState最終影響的就是瀏覽器歷史記錄棧裡面的內容,所以就花了點時間琢磨了一下瀏覽器是如何管理歷史記錄堆疊的。因為在研究的過程中,發現了一些曾經不曾注意到一些要點,所以就記錄下來了。
demo網址:http://liuyunzhuge.github.io/blog/history/demo1.html
這個demo用於進行本文後面內容涉及到的相關測試,假如你也感興趣的話,建議每次要測試一個新的問題時,都在新選項卡里面打開這個demo,而不是從一個已經打開過網頁的選項卡裡面打開;因為已經打開過網頁的選項卡,它的歷史記錄棧裡面已經包含了之前訪問的網頁記錄,所以會對你要測試的問題結果產生影響。
瀏覽器會對同一個視窗(選項卡)中造訪的網頁進行記錄,不管我們是透過以下哪種方式改變網頁,瀏覽器都會把改變後的網頁記錄下來,以便透過瀏覽器的前進和後退按鈕,能夠快速的切換到已經訪問過的網頁:
1)直接在地址欄輸入網頁地址;
2)通過網頁內的超鏈接點擊,跳轉到其它網頁;但是不能是在新窗口中打開的鏈接;
3)透過腳本改變 location.href跳到其它網頁;
4)透過表單提交跳到其它網頁;但是不能是提交到新視窗的表單。
總之,只要是在同一個視窗內,網頁發生了跳轉,瀏覽器都會記錄下來。不過刷新除外,history物件的length屬性可以查看目前視窗儲存的歷史記錄總數,在前面的demo頁面中,我把這個屬性印在頁面上,只有網頁改變的時候,這個屬性才會改變;而刷新網頁不會改變這個屬性。
瀏覽器有一個資料結構來儲存網頁的歷史記錄,我把它稱之為歷史記錄棧,因為它的結構跟棧的使用方式有些相似。
操作測試一:假如你複製前面的demo位址,然後在chrome瀏覽器下按以下步驟進行:
開啟新分頁;輸入demo1.html;點選demo2.html;點選demo3.html;點選demo4.html;點選demo3.html;點選demo2.html;點選demo1.html。
瀏覽器會以下圖片類似的方式來儲存以上的存取記錄:
由於現在的瀏覽器都是多選項卡的模式,當你打開一個選項卡的時候,即使沒有訪問具體網頁,瀏覽器也為這個選項卡創建好了BOM對象,比如history對象,然後把新選項卡片的空白頁作為歷史記錄裡面的第一筆記錄。所以在上圖的最後一列可以看到8筆記錄,跟demo頁面裡顯示的數字一樣:
跟歷史記錄棧一起的,瀏覽器還有一個訪問指標來表示當前網頁在歷史記錄棧中的位置。預設情況下,當我們透過前面列舉的方式改變網頁位址的時候,都會把新的頁面壓入到歷史記錄堆疊的頂部,同時把指標指向到這個最新的網頁,就如上面的圖中所示,每次改變了頁面,當前頁面的指標始終指向的是歷史記錄棧最頂部的那筆記錄;當我們通過瀏覽器的前進後退功能(包括按鈕,快捷,右鍵選單等方式)或者是history提供的go /back/forward方法,都不會改變歷史記錄堆疊的內容,只會移動一下這個指標:
1)前進功能/go(1)/forward,只是讓這個指標上移1個位置;
2)後退功能/go(-1)/forward,只是讓這個指標下移1個位置;
3)go(n)讓指標上移n個位置;go(-n)讓指標下移n個位置。
瀏覽器根據移動後的指標位置,找到歷史記錄堆疊中的網頁進行顯示。假如接著操作測試一的結果,繼續做以下操作。
操作測試二:點選7次瀏覽器後退按鈕。
瀏覽器此時歷史記錄棧的儲存情況就變成下面這個狀態了:
雖然history.go(n)和history.go(-n)可以將指標移到任意位置,但是當要移動到的位置超出了歷史記錄堆疊的位置範圍時,指標就不會移動。所以在操作測試二的結果中,呼叫history.go(-100)和history.go(100)都是不會運作的。
還有兩種情況會改變歷史記錄堆疊的內容。
操作測試三:假如我們接著操作測試二的結果,點擊三次前進按鈕,讓瀏覽器的歷史記錄棧進入到下面這個狀態:
此時由於操作測試二和操作測試三都沒有改變歷史記錄棧的內容,所以正確的話,頁面上的歷史記錄統計應該還是8:
操作測試四:接著,我們做以下兩步驟操作:點選demo2.html,點選demo3.html。這時候頁面上的歷史記錄統計變成了:
history.length已經改變了,表示歷史記錄棧的內容也改變了。只不過為什麼變成6,而不是10(8+2)呢?看看此時瀏覽器歷史記錄堆疊的狀態:
瀏覽器在往歷史記錄棧裡面壓入新的記錄時,是直接在當前指針後面壓入的,如果當前指針的後面,還有其它的記錄項,都會被丟棄掉。這樣就好理解為啥操作測試四之後的歷史記錄總數只有6個了。
瀏覽器對歷史記錄的管理還有一個重點就是對歷史記錄棧的儲存總數有限制,chrome和firefox都是50。當歷史記錄棧的存儲的量超出這個限制後,歷史記錄的存儲就會採取滾動的方式存儲,也就是新的記錄會壓入到棧的頂部,最底部的記錄會從棧的底部移除出去。透過在demo頁面裡,不斷切換點擊demo1,demo2,demo3,demo4,當達到一定次數的時候,頁面列印的統計資料不再變化,就表示達到歷史記錄達到限制了。不過IE11,我點到100多,發現它還在變化,顯示IE的限制可能更高,也可能沒有。 。
本文記錄了一些瀏覽器關於歷史記錄管理的內容,可能有分析不到位的地方,歡迎大家的批評與指正。以上內容希望對有需要的朋友加深對history以及pushState的理解有所幫助,謝謝閱讀:)

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

HTML、CSS和JavaScript在Web開發中的作用分別是:1.HTML定義網頁結構,2.CSS控製網頁樣式,3.JavaScript添加動態行為。它們共同構建了現代網站的框架、美觀和交互性。

HTML的未來趨勢是語義化和Web組件,CSS的未來趨勢是CSS-in-JS和CSSHoudini,JavaScript的未來趨勢是WebAssembly和Serverless。 1.HTML的語義化提高可訪問性和SEO效果,Web組件提升開發效率但需注意瀏覽器兼容性。 2.CSS-in-JS增強樣式管理靈活性但可能增大文件體積,CSSHoudini允許直接操作CSS渲染。 3.WebAssembly優化瀏覽器應用性能但學習曲線陡,Serverless簡化開發但需優化冷啟動問題。

HTML的未來充滿了無限可能。 1)新功能和標準將包括更多的語義化標籤和WebComponents的普及。 2)網頁設計趨勢將繼續向響應式和無障礙設計發展。 3)性能優化將通過響應式圖片加載和延遲加載技術提升用戶體驗。

HTML、CSS和JavaScript在網頁開發中的角色分別是:HTML負責內容結構,CSS負責樣式,JavaScript負責動態行為。 1.HTML通過標籤定義網頁結構和內容,確保語義化。 2.CSS通過選擇器和屬性控製網頁樣式,使其美觀易讀。 3.JavaScript通過腳本控製網頁行為,實現動態和交互功能。

HTML是構建網頁結構的基石。 1.HTML定義內容結構和語義,使用、、等標籤。 2.提供語義化標記,如、、等,提升SEO效果。 3.通過標籤實現用戶交互,需注意表單驗證。 4.使用、等高級元素結合JavaScript實現動態效果。 5.常見錯誤包括標籤未閉合和屬性值未加引號,需使用驗證工具。 6.優化策略包括減少HTTP請求、壓縮HTML、使用語義化標籤等。

HTML、CSS和JavaScript是構建現代網頁的核心技術:1.HTML定義網頁結構,2.CSS負責網頁外觀,3.JavaScript提供網頁動態和交互性,它們共同作用,打造出用戶體驗良好的網站。

HTMLISNOTAPROGRAMMENGUAGE; ITISAMARKUMARKUPLAGUAGE.1)htmlStructures andFormatSwebContentusingtags.2)itworkswithcsssforstylingandjavascript for Interactivity,增強WebevebDevelopment。

HTML是一種用於構建網頁的語言,通過標籤和屬性定義網頁結構和內容。 1)HTML通過標籤組織文檔結構,如、。 2)瀏覽器解析HTML構建DOM並渲染網頁。 3)HTML5的新特性如、、增強了多媒體功能。 4)常見錯誤包括標籤未閉合和屬性值未加引號。 5)優化建議包括使用語義化標籤和減少文件大小。
