這個功能之前有簡單的帶過,這次詳細(xì)的講解下原理和存在的問題(由于是運(yùn)用html5的新API 所以有兼容問題,推薦移動端使用該方法)。 功能描述: 在瀏覽器中新建標(biāo)簽頁并指定一個網(wǎng)址,網(wǎng)頁加載完畢后,正常流程下是不允許點擊返回的。因為當(dāng)前標(biāo)簽頁的相關(guān)歷史記錄是沒有的,所以沒有記錄可以返回。 應(yīng)客戶要求,需要在這種情況下,給他的歷史記錄里添加一個鏈接(比如首頁),這樣在新打開的頁面,點擊返回就可以跳轉(zhuǎn)到首頁,讓用戶看到系統(tǒng)的各種功能,推廣平臺。 一、知識要點 HTML5引進(jìn)了history.pushState()方法和history.replaceState()方法,它們允許你逐條地添加和修改歷史記錄條目。這些方法可以協(xié)同window.onpopstate事件一起工作。 案例: 復(fù)制代碼 代碼如下: var stateObj = { foo: "bar" }; history.pushState(stateObj, "page 2", "bar.html"); 這將讓瀏覽器的地址欄顯示http://mozilla.org/bar.html,但不會加載bar.html頁面也不會檢查bar.html是否存在。 假設(shè)現(xiàn)在用戶導(dǎo)航到了http://google.com,然后點擊了后退按鈕,此時,地址欄將會顯示http://mozilla.org/bar.html,并且頁面會觸發(fā)popstate事件,該事件中的狀態(tài)對象(state object)包含stateObj的一個拷貝。該頁面看起來像foo.html,盡管頁面內(nèi)容可能在popstate事件中被修改。 如果我們再次點擊后退按鈕,URL將變回http://mozilla.org/foo.html 文檔將觸發(fā)另一個popstate事件,這次的狀態(tài)對象為null。回退同樣不會改變文檔內(nèi)容。 pushState()方法 狀態(tài)對象(state object) — 一個JavaScript對象,與用pushState()方法創(chuàng)建的新歷史記錄條目關(guān)聯(lián)。無論何時用戶導(dǎo)航到新創(chuàng)建的狀態(tài),popstate事件都會被觸發(fā),并且事件對象的state屬性都包含歷史記錄條目的狀態(tài)對象的拷貝。 任何可序列化的對象都可以被當(dāng)做狀態(tài)對象。因為FireFox瀏覽器會把狀態(tài)對象保存到用戶的硬盤,這樣它們就能在用戶重啟瀏覽器之后被還原,我們強(qiáng)行限制狀態(tài)對象的大小為640k。如果你向pushState()方法傳遞了一個超過該限額的狀態(tài)對象,該方法會拋出異常。如果你需要存儲很大的數(shù)據(jù),建議使用sessionStorage或localStorage。 標(biāo)題(title) — FireFox瀏覽器目前會忽略該參數(shù),雖然以后可能會用上??紤]到未來可能會對該方法進(jìn)行修改,傳一個空字符串會比較安全?;蛘撸阋部梢詡魅胍粋€簡短的標(biāo)題,標(biāo)明將要進(jìn)入的狀態(tài)。 地址(URL) — 新的歷史記錄條目的地址。瀏覽器不會在調(diào)用pushState()方法后加載該地址,但之后,可能會試圖加載,例如用戶重啟瀏覽器。新的URL不一定是絕對路徑;如果是相對路徑,它將以當(dāng)前URL為基準(zhǔn);傳入的URL與當(dāng)前URL應(yīng)該是同源的,否則,pushState()會拋出異常。該參數(shù)是可選的;不指定的話則為文檔當(dāng)前URL。 注意: 在 Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1) 至 Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2) 中,傳入的對象使用JSON來進(jìn)行序列化。從 Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)開始,對象使用結(jié)構(gòu)化拷貝算法來進(jìn)行序列化。這將允許更多類型的對象能夠安全傳入。 1、新的URL可以是任意的同源URL,與此相反,使用window.location方法時,只有僅修改 hash 才能保證停留在相同的document中。 2、根據(jù)個人需要來決定是否修改URL。相反,設(shè)置window.location='#foo',只有在當(dāng)前hash值不是foo時才創(chuàng)建一條新歷史記錄。 3、你可以在新的歷史記錄條目中添加抽象數(shù)據(jù)。如果使用基于hash的方法,你只能把相關(guān)數(shù)據(jù)轉(zhuǎn)碼成一個很短的字符串。 注意pushState()方法永遠(yuǎn)不會觸發(fā)hashchange事件,即便新的地址只變更了hash。 popstate事件 replaceState()方法 當(dāng)你為了響應(yīng)用戶的某些操作,而要更新當(dāng)前歷史記錄條目的狀態(tài)對象或URL時,使用replaceState()方法會特別合適。 二、實現(xiàn)思路 2.觸發(fā)事件時,判斷當(dāng)前頁面的歷史記錄 是否有頁面可以返回。 3.如果沒有頁面可以返回,則插入兩條記錄: 1)、指定的跳轉(zhuǎn)頁面。 2)、空記錄。(使當(dāng)前頁面不發(fā)生變化) 三、實現(xiàn)方法
判斷當(dāng)前history中的記錄個數(shù),由于頁面加載的時候,瀏覽器會自動push進(jìn)一個記錄。所以要判斷長度是否小于2. 塞進(jìn)的state對象是為了獲取對應(yīng)的url鏈接。
這段代碼放置在頁面的ready事件中執(zhí)行,延遲300毫秒是為了將操作滯后,防止與系統(tǒng)pop事件沖突。 總結(jié): 希望看到這篇文章的朋友可以得到一些啟發(fā),或者是有更好的方法實現(xiàn)。 |
|