最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

功能描述:

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

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

一、知識要點

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

案例:

假設 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是否存在。

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

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

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

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

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

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

地址(URL) — 新的歷史記錄條目的地址。瀏覽器不會在調用pushState()方法后加載該地址,但之后,可能會試圖加載,例如用戶重啟瀏覽器。新的URL不一定是絕對路徑;如果是相對路徑,它將以當前URL為基準;傳入的URL與當前URL應該是同源的,否則,pushState()會拋出異常。該參數(shù)是可選的;不指定的話則為文檔當前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',它們都會在當前文檔內創(chuàng)建和激活新的歷史記錄條目。但pushState()有自己的優(yōu)勢:

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

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

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

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

popstate事件

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

replaceState()方法

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

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

二、實現(xiàn)思路

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

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

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

1)、指定的跳轉頁面。

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

三、實現(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) 
}

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

塞進的state對象是為了獲取對應的url鏈接。

注意點:

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

 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對象,因為只有滿足我們要求的記錄才會有我們添加的state對象 所以 根據(jù)這點可以進行頁面的跳轉操作。
這樣就可以實現(xiàn)我們想要的效果。

四、寫在最后

缺點:

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

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

總結:

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

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

相關文章

  • 微信小程序實現(xiàn)左滑刪除效果源碼

    微信小程序實現(xiàn)左滑刪除效果源碼

    這篇文章主要給大家介紹了關于微信小程序實現(xiàn)左滑刪除效果的相關資料,左滑刪除效果在app的交互方式中十分流行,比如全民應用微信,文中給出了詳細的實現(xiàn)代碼,需要的朋友可以參考下
    2023-08-08
  • 淺析JS異步加載進度條

    淺析JS異步加載進度條

    這篇文章主要介紹了JS異步加載進度條 的相關資料,需要的朋友可以參考下
    2016-05-05
  • 微信小程序中獲取用戶手機號授權登錄詳細步驟

    微信小程序中獲取用戶手機號授權登錄詳細步驟

    這篇文章主要給大家介紹了關于微信小程序中獲取用戶手機號授權登錄的詳細步驟,在微信小程序中開發(fā)者可以通過微信提供的API接口實現(xiàn)用戶登錄和獲取用戶的手機號,需要的朋友可以參考下
    2023-07-07
  • 用js實現(xiàn)猜數(shù)字小游戲

    用js實現(xiàn)猜數(shù)字小游戲

    這篇文章主要為大家詳細介紹了用js實現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 微信小程序全局文件的使用詳解

    微信小程序全局文件的使用詳解

    在小程序開發(fā)時,每個頁面都對應一個目錄,每個目錄又分別有wxml、wxss、js和json四個文件。詳細說明可查看后續(xù)文章介紹,本文主要詳解全局文件
    2022-08-08
  • 在for循環(huán)中l(wèi)ength值是否需要緩存

    在for循環(huán)中l(wèi)ength值是否需要緩存

    這篇文章主要介紹了在for循環(huán)中l(wèi)ength值是否需要緩存,需要的朋友可以參考下
    2015-07-07
  • JavaScript模擬實現(xiàn)新浪下拉菜單效果

    JavaScript模擬實現(xiàn)新浪下拉菜單效果

    這篇文章主要為大家介紹了如何通過JavaScript模擬實現(xiàn)新浪的下拉菜單效果,文中的示例代碼講解詳細,感興趣的小伙伴可以動手試一試
    2022-03-03
  • javascript漢字拼音互轉的簡單實例

    javascript漢字拼音互轉的簡單實例

    下面小編就為大家?guī)硪黄猨avascript漢字拼音互轉的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • javascript命名約定(變量?函數(shù)?類?組件)

    javascript命名約定(變量?函數(shù)?類?組件)

    這篇小文章主要是通過一些例子來介紹一些Javascript中一些關于命名變量,函數(shù),類或者是組件的通用約定,雖然這些規(guī)則并不是強制性的,但是呢,他們卻被一些JS社區(qū)所廣泛采用,所以,了解他們還是很有必要的
    2023-03-03
  • 非常不錯的不間斷循環(huán)滾動類 兼容多瀏覽器

    非常不錯的不間斷循環(huán)滾動類 兼容多瀏覽器

    非常不錯的不間斷循環(huán)滾動類 兼容多瀏覽器...
    2006-12-12

最新評論

台前县| 阳春市| 星子县| 抚顺县| 拜泉县| 康保县| 德化县| 南陵县| 广安市| 武宁县| 普兰县| 宁海县| 林口县| 桦川县| 蒙阴县| 崇文区| 唐河县| 赤峰市| 子洲县| 武义县| 康马县| 德格县| 乐清市| 彰武县| 杭锦旗| 屏东县| 芜湖县| 讷河市| 西城区| 新平| 邵武市| 离岛区| 南京市| 盐边县| 太原市| 太和县| 绥滨县| 新和县| 阳原县| 雷波县| 来安县|