中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

js如何實現點擊返回跳轉到指定頁面

發布時間:2022-10-22 09:12:17 來源:億速云 閱讀:1053 作者:iii 欄目:編程語言

這篇文章主要介紹了js如何實現點擊返回跳轉到指定頁面的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇js如何實現點擊返回跳轉到指定頁面文章都會有所收獲,下面我們一起來看看吧。

功能描述:

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

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

一、知識要點

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。回退同樣不會改變文檔內容。

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對象 所以 根據這點可以進行頁面的跳轉操作。這樣就可以實現我們想要的效果。

關于“js如何實現點擊返回跳轉到指定頁面”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“js如何實現點擊返回跳轉到指定頁面”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

js
AI

图们市| 东乌珠穆沁旗| 永寿县| 洪洞县| 黄浦区| 周宁县| 天等县| 灵台县| 堆龙德庆县| 张掖市| 丹棱县| 都昌县| 伊金霍洛旗| 永昌县| 越西县| 宽城| 济源市| 石嘴山市| 锡林郭勒盟| 乐昌市| 达拉特旗| 苍梧县| 天柱县| 普洱| 海兴县| 东辽县| 枣强县| 纳雍县| 秭归县| 白山市| 阿勒泰市| 敦煌市| 米易县| 高安市| 德清县| 乐亭县| 萨嘎县| 信阳市| 柯坪县| 建阳市| 资阳市|