亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

js點(diǎn)擊返回跳轉(zhuǎn)到指定頁面實(shí)現(xiàn)過程

 更新時間:2020年08月20日 14:39:19   作者:Cydiacen  
這篇文章主要為大家詳細(xì)介紹了js點(diǎn)擊返回跳轉(zhuǎn)到指定頁面實(shí)現(xiàn)過程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

這個功能之前有簡單的帶過,這次詳細(xì)的講解下原理和存在的問題(由于是運(yùn)用html5的新API 所以有兼容問題,推薦移動端使用該方法)。

功能描述:

在瀏覽器中新建標(biāo)簽頁并指定一個網(wǎng)址,網(wǎng)頁加載完畢后,正常流程下是不允許點(diǎn)擊返回的。因?yàn)楫?dāng)前標(biāo)簽頁的相關(guān)歷史記錄是沒有的,所以沒有記錄可以返回。

應(yīng)客戶要求,需要在這種情況下,給他的歷史記錄里添加一個鏈接(比如首頁),這樣在新打開的頁面,點(diǎn)擊返回就可以跳轉(zhuǎn)到首頁,讓用戶看到系統(tǒng)的各種功能,推廣平臺。

一、知識要點(diǎn)

HTML5引進(jìn)了history.pushState()方法和history.replaceState()方法,它們允許你逐條地添加和修改歷史記錄條目。這些方法可以協(xié)同window.onpopstate事件一起工作。

案例:

假設(shè) http://mozilla.org/foo.html 將執(zhí)行如下JavaScript代碼:

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,然后點(diǎn)擊了后退按鈕,此時,地址欄將會顯示http://mozilla.org/bar.html,并且頁面會觸發(fā)popstate事件,該事件中的狀態(tài)對象(state object)包含stateObj的一個拷貝。該頁面看起來像foo.html,盡管頁面內(nèi)容可能在popstate事件中被修改。

如果我們再次點(diǎn)擊后退按鈕,URL將變回http://mozilla.org/foo.html  文檔將觸發(fā)另一個popstate事件,這次的狀態(tài)對象為null。回退同樣不會改變文檔內(nèi)容。

pushState()方法
pushState()有三個參數(shù):一個狀態(tài)對象、一個標(biāo)題(現(xiàn)在會被忽略),一個可選的URL地址。下面來單獨(dú)考察這三個參數(shù)的細(xì)節(jié):

狀態(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)對象。因?yàn)镕ireFox瀏覽器會把狀態(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)行序列化。這將允許更多類型的對象能夠安全傳入。
某種意義上,調(diào)用pushState()有點(diǎn)類似于設(shè)置window.location='#foo',它們都會在當(dāng)前文檔內(nèi)創(chuàng)建和激活新的歷史記錄條目。但pushState()有自己的優(yōu)勢:

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事件

每當(dāng)激活的歷史記錄發(fā)生變化時,都會觸發(fā)popstate事件。如果被激活的歷史記錄條目是由pushState所創(chuàng)建,或是被replaceState方法影響到的,popstate事件的狀態(tài)屬性將包含歷史記錄的狀態(tài)對象的一個拷貝。

replaceState()方法

history.replaceState()操作類似于history.pushState(),不同之處在于replaceState()方法會修改當(dāng)前歷史記錄條目而并非創(chuàng)建新的條目。

當(dāng)你為了響應(yīng)用戶的某些操作,而要更新當(dāng)前歷史記錄條目的狀態(tài)對象或URL時,使用replaceState()方法會特別合適。

二、實(shí)現(xiàn)思路

1.利用popstate事件,監(jiān)聽點(diǎn)擊返回事件。

2.觸發(fā)事件時,判斷當(dāng)前頁面的歷史記錄 是否有頁面可以返回。

3.如果沒有頁面可以返回,則插入兩條記錄:

1)、指定的跳轉(zhuǎn)頁面。

2)、空記錄。(使當(dāng)前頁面不發(fā)生變化)

三、實(shí)現(xiàn)方法

 //返回之前沒頁面則返回首頁
 function pushHistory() {
 if (history.length < 2) {
 var state = {
  title: "index",
  url: getHttpPrefix + "index.html"
 };
 window.history.pushState(state, "index", location.href);
 state = {
  title: "index",
  url: ""
 };
 window.history.pushState(state, "index", "");
 }
 //lll("history.state" + history.state)
 //console.log(history.state) 
}

判斷當(dāng)前history中的記錄個數(shù),由于頁面加載的時候,瀏覽器會自動push進(jìn)一個記錄。所以要判斷長度是否小于2.

塞進(jìn)的state對象是為了獲取對應(yīng)的url鏈接。

注意點(diǎn):

第一個pushState我將跳轉(zhuǎn)url放進(jìn)state對象 方便跳轉(zhuǎn)操作。第二個參數(shù)沒有實(shí)際意義,因?yàn)楝F(xiàn)在的瀏覽器基本不適用這個參數(shù)。
第三個參數(shù)是會替換當(dāng)前地址欄的鏈接的,但是頁面不會發(fā)生跳轉(zhuǎn)。(我之前犯了個錯誤,將第三個參數(shù)設(shè)置為首頁鏈接,導(dǎo)致了地址欄更改為首頁鏈接,以至于在當(dāng)前頁的鏈接 都以首頁為基礎(chǔ)進(jìn)行跳轉(zhuǎn),導(dǎo)致頁面的所有鏈接都跳轉(zhuǎn)錯誤了。)

 setTimeout(function () {
 pushHistory()
 window.addEventListener("popstate", function (e) {
 lll("popstate"+window.history.state)
 if (window.history.state != null && window.history.state.url != "") {
  location.href = window.history.state.url
 }
 });
 }, 300);

這段代碼放置在頁面的ready事件中執(zhí)行,延遲300毫秒是為了將操作滯后,防止與系統(tǒng)pop事件沖突。
if語句為了判斷 history是否存在state對象,因?yàn)橹挥袧M足我們要求的記錄才會有我們添加的state對象 所以 根據(jù)這點(diǎn)可以進(jìn)行頁面的跳轉(zhuǎn)操作。
這樣就可以實(shí)現(xiàn)我們想要的效果。

四、寫在最后

缺點(diǎn):

1. 很明顯,就如開頭提到的。只適合支持html5的瀏覽器使用。

2.由于插進(jìn)了兩條記錄 ,所以 類似于 微信這種移動端的返回,需要再點(diǎn)擊兩次返回,才能推出頁面,回到微信聊天窗口,用戶體驗(yàn)不好。

總結(jié):

這種方法 一定還可以優(yōu)化和完善,只是目前我的實(shí)力不足,還不足以完善到完美的程度。

希望看到這篇文章的朋友可以得到一些啟發(fā),或者是有更好的方法實(shí)現(xiàn)。

相關(guān)文章

  • js使用DOM設(shè)置單選按鈕、復(fù)選框及下拉菜單的方法

    js使用DOM設(shè)置單選按鈕、復(fù)選框及下拉菜單的方法

    這篇文章主要介紹了js使用DOM設(shè)置單選按鈕、復(fù)選框及下拉菜單的方法,較為詳細(xì)的分析了單選按鈕、復(fù)選框及下拉菜單的具體用法及實(shí)現(xiàn)技巧,非常具有實(shí)用價值,需要的朋友可以參考下
    2015-01-01
  • 使用Web?Component實(shí)現(xiàn)防篡改水印

    使用Web?Component實(shí)現(xiàn)防篡改水印

    Web?Component內(nèi)部有鉤子天然支持被篡改時被觸發(fā),用來防篡改非常方便,所以本文就將使用Web?Component實(shí)現(xiàn)防篡改水印,感興趣的小伙伴可以了解下
    2023-12-12
  • JS?cookie的設(shè)置、讀取和刪除方法例子

    JS?cookie的設(shè)置、讀取和刪除方法例子

    Cookie是客戶端存放數(shù)據(jù)的一種方式,可用來做狀態(tài)保持,下面這篇文章主要給大家介紹了關(guān)于JS?cookie的設(shè)置、讀取和刪除方法例子的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • js動態(tài)拼接正則表達(dá)式的兩種方法

    js動態(tài)拼接正則表達(dá)式的兩種方法

    這篇文章主要介紹了js動態(tài)拼接正則表達(dá)式的兩種方法,需要的朋友可以參考下
    2014-03-03
  • 利用JavaScript實(shí)現(xiàn)繪制2023新年煙花的示例代碼

    利用JavaScript實(shí)現(xiàn)繪制2023新年煙花的示例代碼

    大家過年好!新春佳節(jié),在這個充滿喜悅的日子里,愿新年的鐘聲帶給你一份希望和期待。在這喜慶的日子里,小編和大家分享一個煙花代碼,希望大家能夠喜歡
    2023-01-01
  • JS onmousemove鼠標(biāo)移動坐標(biāo)接龍DIV效果實(shí)例

    JS onmousemove鼠標(biāo)移動坐標(biāo)接龍DIV效果實(shí)例

    這篇文章主要介紹了JS onmousemove鼠標(biāo)移動坐標(biāo)接龍DIV效果實(shí)例,有需要的朋友可以參考一下
    2013-12-12
  • JS 箭頭函數(shù)的this指向詳解

    JS 箭頭函數(shù)的this指向詳解

    這篇文章主要給大家介紹了關(guān)JS 箭頭函數(shù)的this指向,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11
  • 側(cè)欄跟隨滾動的簡單實(shí)現(xiàn)代碼

    側(cè)欄跟隨滾動的簡單實(shí)現(xiàn)代碼

    側(cè)欄里的有些內(nèi)容滾動到頁面頂端以后就固定在那個位置,不再跟隨滾動條而滾動,想必很多站長朋友都想實(shí)現(xiàn)這個效果吧,接下來為大家詳細(xì)介紹下,感興趣的你可不要錯過了哈
    2013-03-03
  • JS可視化學(xué)習(xí)向量計算點(diǎn)到線段的距離并展示

    JS可視化學(xué)習(xí)向量計算點(diǎn)到線段的距離并展示

    這篇文章主要為大家介紹了JS可視化學(xué)習(xí)向量計算點(diǎn)到線段的距離并展示實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Javascript的比較匯總

    Javascript的比較匯總

    本文匯總了Javascript中兩個對象的比較、不同類型的比較以及對象跟原始值的比較,并進(jìn)行了實(shí)例演示,希望能幫助到有需要的朋友們。
    2016-07-07

最新評論