【譯】使用 HTML5 History API 控制瀏覽器位址列 URL
原文:抱歉找不到了
HTML5 的 History API 可以讓開發者不重新整理整個頁面就可以修改網站的 URL。這在使用 JavaScript 載入一個頁面的一部分的時候尤其有用,用 JavaScript 新載入的這一部分內容是明顯不同的, 因而有必要使用一個新的 URL(原文: This is particularly useful for loading portions of a page with JavaScript, such that the content is significantly different and warrants a new URL.)。
這裡有一個例子,我們假設一個人從一個網站的 Homepage 前往訪問 Help 頁面。我們使用 Ajax 載入 Help 頁面的內容。那個使用者隨後又訪問 Product 頁面,而我們還是用 Ajax 載入並替換內容。然後,使用者想分享這個頁面(即 Product 頁面)的 URL。通過 History API,我們本可以(we could have been)隨著使用者的訪問而正確地修改頁面的 URL,所以他們看見(或分享或儲存)的 URL 是相關的並且正確的。
基礎原理
要檢視這個 API 的特徵,只需要開啟 the Developer Tools(即瀏覽器的開發者工具),在控制檯輸入(type into)history
。如果你選擇的瀏覽器支援這個 API,那麼我們將會看到許多隸屬於這個物件的方法(a host of methods attached to this object):
History {length: 2, state: null, scrollRestoration: "auto"}
length:2
scrollRestoration:"auto"
state:null
__proto__:History
back:back()
constructor:History()
forward:forward()
go:go()
length:(...)
get length:()
pushState:pushState()
replaceState:replaceState()
scrollRestoration:(...)
get scrollRestoration:()
set scrollRestoration:()
state:(...)
get state:()
Symbol(Symbol.toStringTag):"History"
__proto__:Object
我們只對說明中的pushState
和replaceState
感興趣。回到控制檯,我們可以試驗一下這些方法並看看當我們使用這些方法的時候 URL 發生什麼變化。我們稍後將覆蓋其他引數,但現在我們所要使用的是最後的這個引數:
history.replaceState(null, null, 'hello');
儘管沒有請求資源,視窗也保持著同一個頁面,但上面的replaceState
方法用/hello
作為位址列中 URL 的結尾(原文:The replaceState method above switches out the URL in the address bar with '/hello' despite no assets being requested and the window remaining on the same page. )。這裡還有一個問題。當點選瀏覽器上的返回按鈕的時候,我們會發現我們並沒有返回到這篇文章的 URL ,而是回到我們之前所停留的頁面。這是因為replaceState
沒有處理瀏覽器的歷史,它只是簡單地替換位址列中當前的 URL。
要解決(fix)這個問題,我們需要使用pushState
方法來代替:
history.pushState(null, null, 'hello');
現在,如果我們點選瀏覽器的返回按鈕,我們會發現它會像我們所希望的一樣執行,因為pushState
已經修改了我們的歷史(記錄)以包含我們剛剛所傳遞進去的 URL。這很有趣,但如果我們做一些不那麼直接的嘗試並且假裝當前的 URL 一直都不是“css-tricks.com”而是完完全全是另一個網站,之後會發生什麼呢?
history.pushState(null, null, 'https://twitter.com/hello');
這會丟擲一個異常,因為 URL 必須與當前的 URL 同源(has to be of the same origin as the current one),否則,我們可能冒著重大的安全漏洞風險(原文:we might risk major security flaws )並且是開發者能夠欺騙人們讓他們完全相信自己是在一個不同的網站(give developers the ability to fool people into believing they were on a different website altogether)。
回頭看看被傳入到這個函式中的其他引數,我們可以總結如下:
history.pushState([data], [title], [url]);
- 如果網頁的狀態改變了,例如:每當有人按下瀏覽器中的返回或前進按鈕,我們將需要的資料就是第一個引數。需要注意的是:在 Firefox 中,這個資料被限制為 640k 個字元。
-
title
是第二個引數,他可以是一個字串,但截至本文寫作時間(2015年3月9日),所有瀏覽器都簡單地忽略它。 - 最後的這個引數就是我們希望出現在位址列的 URL。
簡史(A Quick History)
這些 history API 最值得注意的是,它們不會重新載入頁面。在過去,改變 URL 的唯一方法是window.locaton
,但它總是會重新載入頁面。 除非,如果你所改變的只是hash
(就像 點選<a href="#target">link</a>
不會重新載入頁面 一樣)(原文:Except, if all you changed was the hash
)。
這與舊的 hashbang 方法相通,hashbang 方法可以改變 URL 而不重新整理整個頁面。總所周知,Twitter 曾經這樣子做並因此而在很大程度上收到了批評(hash 不是一個真的資源地址)。
Twitter 放棄了使用這個方法,並且成為 history API 最早的支持者之一。

相關文章
- 瀏覽器位址列裡輸入URL後的全過程瀏覽器
- 從瀏覽器位址列輸入url到顯示頁面的步驟瀏覽器
- 瀏覽器位址列輸入url回車之後發生了些什麼瀏覽器
- 在瀏覽器位址列輸入url到按下回車發生了什麼?瀏覽器
- chrome 瀏覽器位址列快速搜尋設定Chrome瀏覽器
- HTML5 : History APIHTMLAPI
- 譯文:瀏覽器輸入URL發生了什麼?瀏覽器
- 如何恢復谷歌瀏覽器Google Chrome位址列的HTTP和WWW字首谷歌瀏覽器GoChromeHTTP
- 經典面試題:在瀏覽器位址列輸入一個 URL 後回車,背後發生了什麼面試題瀏覽器
- JS獲取瀏覽器位址列的多個引數值的任意值JS瀏覽器
- 瀏覽器全屏API瀏覽器API
- 瀏覽器可以自動修改URL?瀏覽器
- Go Search Extension,快速在位址列搜尋 Go 文件的開源瀏覽器外掛Go瀏覽器
- 2. 瀏覽器控制瀏覽器
- 瀏覽器從輸入URL到渲染瀏覽器
- 瀏覽器輸入URL回車後...瀏覽器
- 使用 JavaScript 操作瀏覽器歷史記錄 APIJavaScript瀏覽器API
- 操縱瀏覽器歷史記錄 : popstate() 、 history.pushState() 、 window.history.pushState()瀏覽器
- 瀏覽器路由 API 詳解瀏覽器路由API
- SAP Data Intelligence Graph使用瀏覽器訪問的url規範Intel瀏覽器
- html5多終端瀏覽器相容HTML瀏覽器
- HTML5 之瀏覽器支援介紹HTML瀏覽器
- 瀏覽器中輸入 URL 回車後瀏覽器
- [譯]瀏覽器工作原理探究瀏覽器
- 監聽瀏覽器返回,pushState,popstate 事件,window.history物件瀏覽器事件物件
- Js 和Url預設位址列編碼等處理JS
- Fetch 代替 Ajax 的瀏覽器 API瀏覽器API
- Java Selenium WebDriver 控制瀏覽器(三)JavaWeb瀏覽器
- 使用瀏覽器事件瀏覽器事件
- [譯] 瀏覽器中 CSS 支援指南瀏覽器CSS
- win10系統edge瀏覽器點選位址列就會出現熱門站點如何取消Win10瀏覽器
- 利用HTML5的history.replacestate()修改當前頁面的URLHTML
- 【譯】瀏覽器如何工作:在現代web瀏覽器場景的之下瀏覽器Web
- 瀏覽器語音桌面通知,Notification API瀏覽器API
- 【譯】用 JavaScript 和 Emoji 做位址列動畫JavaScript動畫
- window中location物件改變瀏覽器URL和位置物件瀏覽器
- 使用chrome瀏覽器驅動自動開啟瀏覽器Chrome瀏覽器
- 【譯】如何停止使用console.log()轉而使用瀏覽器debugger瀏覽器
- 瀏覽器DevTools使用技巧瀏覽器dev