亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

js點擊返回跳轉到指定頁面實現過程

2019-11-20 10:14:36
字體:
來源:轉載
供稿:網友

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

功能描述:

在瀏覽器中新建標簽頁并指定一個網址,網頁加載完畢后,正常流程下是不允許點擊返回的。因為當前標簽頁的相關歷史記錄是沒有的,所以沒有記錄可以返回。

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

一、知識要點

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

 案例:
假設 http://mozilla.org/foo.html 將執行如下JavaScript代碼:

復制代碼 代碼如下:
 var stateObj = { foo: "bar" }; history.pushState(stateObj, "page 2", "bar.html");

這將讓瀏覽器的地址欄顯示http://mozilla.org/bar.html,但不會加載bar.html頁面也不會檢查bar.html是否存在。

假設現在用戶導航到了http://google.com,然后點擊了后退按鈕,此時,地址欄將會顯示http://mozilla.org/bar.html,并且頁面會觸發popstate事件,該事件中的狀態對象(state object)包含stateObj的一個拷貝。該頁面看起來像foo.html,盡管頁面內容可能在popstate事件中被修改。

如果我們再次點擊后退按鈕,URL將變回http://mozilla.org/foo.html  文檔將觸發另一個popstate事件,這次的狀態對象為null?;赝送瑯硬粫淖兾臋n內容。

pushState()方法
pushState()有三個參數:一個狀態對象、一個標題(現在會被忽略),一個可選的URL地址。下面來單獨考察這三個參數的細節:

狀態對象(state object) ― 一個JavaScript對象,與用pushState()方法創建的新歷史記錄條目關聯。無論何時用戶導航到新創建的狀態,popstate事件都會被觸發,并且事件對象的state屬性都包含歷史記錄條目的狀態對象的拷貝。

任何可序列化的對象都可以被當做狀態對象。因為FireFox瀏覽器會把狀態對象保存到用戶的硬盤,這樣它們就能在用戶重啟瀏覽器之后被還原,我們強行限制狀態對象的大小為640k。如果你向pushState()方法傳遞了一個超過該限額的狀態對象,該方法會拋出異常。如果你需要存儲很大的數據,建議使用sessionStorage或localStorage。

標題(title) ― FireFox瀏覽器目前會忽略該參數,雖然以后可能會用上??紤]到未來可能會對該方法進行修改,傳一個空字符串會比較安全。或者,你也可以傳入一個簡短的標題,標明將要進入的狀態。

地址(URL) ― 新的歷史記錄條目的地址。瀏覽器不會在調用pushState()方法后加載該地址,但之后,可能會試圖加載,例如用戶重啟瀏覽器。新的URL不一定是絕對路徑;如果是相對路徑,它將以當前URL為基準;傳入的URL與當前URL應該是同源的,否則,pushState()會拋出異常。該參數是可選的;不指定的話則為文檔當前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來進行序列化。從 Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)開始,對象使用結構化拷貝算法來進行序列化。這將允許更多類型的對象能夠安全傳入。
某種意義上,調用pushState()有點類似于設置window.location='#foo',它們都會在當前文檔內創建和激活新的歷史記錄條目。但pushState()有自己的優勢:

1、新的URL可以是任意的同源URL,與此相反,使用window.location方法時,只有僅修改 hash 才能保證停留在相同的document中。

2、根據個人需要來決定是否修改URL。相反,設置window.location='#foo',只有在當前hash值不是foo時才創建一條新歷史記錄。

3、你可以在新的歷史記錄條目中添加抽象數據。如果使用基于hash的方法,你只能把相關數據轉碼成一個很短的字符串。

注意pushState()方法永遠不會觸發hashchange事件,即便新的地址只變更了hash。

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

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

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

 二、實現思路
1.利用popstate事件,監聽點擊返回事件。

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

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

1)、指定的跳轉頁面。

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

 三、實現方法

 //返回之前沒頁面則返回首頁    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) }

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

塞進的state對象是為了獲取對應的url鏈接。
注意點:
第一個pushState我將跳轉url放進state對象 方便跳轉操作。第二個參數沒有實際意義,因為現在的瀏覽器基本不適用這個參數。
第三個參數是會替換當前地址欄的鏈接的,但是頁面不會發生跳轉。(我之前犯了個錯誤,將第三個參數設置為首頁鏈接,導致了地址欄更改為首頁鏈接,以至于在當前頁的鏈接 都以首頁為基礎進行跳轉,導致頁面的所有鏈接都跳轉錯誤了。)

  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事件中執行,延遲300毫秒是為了將操作滯后,防止與系統pop事件沖突。
if語句為了判斷 history是否存在state對象,因為只有滿足我們要求的記錄才會有我們添加的state對象 所以 根據這點可以進行頁面的跳轉操作。
這樣就可以實現我們想要的效果。
 四、寫在最后
缺點:
    1. 很明顯,就如開頭提到的。只適合支持html5的瀏覽器使用。
    2.由于插進了兩條記錄 ,所以 類似于 微信這種移動端的返回,需要再點擊兩次返回,才能推出頁面,回到微信聊天窗口,用戶體驗不好。

總結:
這種方法 一定還可以優化和完善,只是目前我的實力不足,還不足以完善到完美的程度。

希望看到這篇文章的朋友可以得到一些啟發,或者是有更好的方法實現。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美黑人国产人伦爽爽爽| 国产免费亚洲高清| 欧美性精品220| 91精品国产777在线观看| 91超碰caoporn97人人| 日韩欧美在线视频| 日韩在线视频免费观看高清中文| 影音先锋日韩有码| 91日本视频在线| 国产欧美va欧美va香蕉在| 性欧美视频videos6一9| 色综合视频网站| 黄色成人av网| 久久久久久久久久久人体| 国产精品久久久久久久久久久久| 欧美xxxx14xxxxx性爽| 亚洲韩国青草视频| 成人美女av在线直播| 国产69久久精品成人看| 综合国产在线视频| 久久久久免费精品国产| 亚洲美女av黄| 美女啪啪无遮挡免费久久网站| 亚洲久久久久久久久久| 国产日韩欧美影视| 国产亚洲一区二区在线| 亚洲性xxxx| 亚洲香蕉成视频在线观看| 亚洲天堂av图片| 欧美亚洲在线观看| 中文字幕精品av| 成人中心免费视频| 成人久久一区二区三区| 国产精品久久久久久久7电影| 欧美精品在线免费播放| 亚洲永久免费观看| 日韩av在线天堂网| 亚洲国产精品电影在线观看| 国产精品青青在线观看爽香蕉| 成人亲热视频网站| 亚洲国产精品久久久久久| 欧美一级淫片aaaaaaa视频| 97在线视频免费看| 亚洲第一视频网| 国产亚洲一区精品| 精品呦交小u女在线| 欧美日韩中文在线观看| 蜜臀久久99精品久久久久久宅男| 日韩av电影在线网| 91免费人成网站在线观看18| 日韩精品在线免费观看| 久久久免费av| 亚洲影院色在线观看免费| 国产成人中文字幕| 91精品国产91久久久久久吃药| 91美女福利视频高清| 国产99久久精品一区二区 夜夜躁日日躁| 性色av一区二区三区在线观看| 久久视频免费在线播放| 国产精品久久久久久av福利| 亚洲综合国产精品| 69影院欧美专区视频| 日韩高清电影好看的电视剧电影| 全亚洲最色的网站在线观看| 亚洲激情在线观看视频免费| 日韩欧美黄色动漫| 久久精品在线视频| 中文在线不卡视频| 成人午夜黄色影院| 亚洲视频在线免费观看| 欧美小视频在线| 亚洲国产成人精品久久| 欧洲美女免费图片一区| 18性欧美xxxⅹ性满足| 国产又爽又黄的激情精品视频| 亚洲午夜精品久久久久久久久久久久| 国产精品都在这里| 亚洲国内精品在线| 欧美日韩视频免费播放| 国产日韩欧美在线视频观看| 日韩精品一区二区视频| 日韩av第一页| 狠狠躁夜夜躁人人爽天天天天97| 久久夜色精品国产欧美乱| 91经典在线视频| 色婷婷**av毛片一区| 国产精品久久久久久久久久三级| 国产精品91在线观看| 欧美大人香蕉在线| 亚洲国产欧美一区二区三区同亚洲| 欧美成人午夜影院| 成人有码视频在线播放| 国产成人精品免高潮在线观看| 欧美精品videosex极品1| 日韩福利在线播放| 成人在线观看视频网站| 亚洲欧美一区二区三区四区| 97成人在线视频| 午夜精品久久久久久久99黑人| 久久久精品日本| 国产精品99蜜臀久久不卡二区| 在线看福利67194| 久久偷看各类女兵18女厕嘘嘘| 亚洲国产日韩精品在线| 91欧美视频网站| 亚洲精品欧美日韩| 国产精品成人久久久久| 欧美性猛交xxxx久久久| 欧美性高潮床叫视频| 欧美自拍视频在线观看| 国产99在线|中文| 国产精品海角社区在线观看| 欧美激情伊人电影| 98精品国产高清在线xxxx天堂| 日韩视频中文字幕| 国产午夜精品免费一区二区三区| 国产99在线|中文| 成人激情视频在线播放| 中文字幕日韩专区| 国产剧情久久久久久| 欧洲日本亚洲国产区| 一道本无吗dⅴd在线播放一区| 亚洲综合日韩在线| 国产99视频精品免视看7| 日韩av综合中文字幕| 国产福利精品av综合导导航| 97视频在线播放| 久久全球大尺度高清视频| 国产va免费精品高清在线观看| 最近日韩中文字幕中文| 92版电视剧仙鹤神针在线观看| 亚洲精品美女免费| 在线免费观看羞羞视频一区二区| 精品久久久在线观看| 91在线观看免费高清完整版在线观看| 国产精品视频永久免费播放| 午夜精品国产精品大乳美女| 国产精品视频26uuu| 中文欧美日本在线资源| 久久国产精品视频| 日韩视频免费在线观看| 欧美成人精品在线视频| 成人激情视频小说免费下载| 欧美大片在线看免费观看| 久久久久国产一区二区三区| 国产91色在线|免| 伊人久久久久久久久久久| 97香蕉久久超级碰碰高清版| 亚洲香蕉伊综合在人在线视看| 国产精品久久久久久久久粉嫩av| 午夜精品视频网站| 欧美贵妇videos办公室| 色狠狠av一区二区三区香蕉蜜桃| 亚洲福利在线视频| 欧美大成色www永久网站婷| 热99精品只有里视频精品| 亚洲第一视频网| 亚洲影视九九影院在线观看| 亚洲精品国产精品国自产观看浪潮| 亚洲精品国产精品久久清纯直播| 欧美日韩国产在线播放| 成人网页在线免费观看| 国产欧美一区二区三区在线| 色狠狠久久aa北条麻妃|