溫馨提示×

溫馨提示×

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

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

javascript中的History對象怎么用

發(fā)布時間:2022-04-26 13:59:03 來源:億速云 閱讀:136 作者:iii 欄目:大數據

這篇文章主要介紹“javascript中的History對象怎么用”,在日常操作中,相信很多人在javascript中的History對象怎么用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”javascript中的History對象怎么用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

length

  history.length屬性保存著歷史記錄的URL數量。初始時,該值為1。由于IE10+瀏覽器在初始時返回2,存在兼容性問題,所以該值并不常用

跳轉方法

  go()、back()和forward()

  如果移動的位置超出了訪問歷史的邊界,以上三個方法并不報錯,而是靜默失敗

  [注意]使用歷史記錄時,頁面通常從瀏覽器緩存之中加載,而不是重新要求服務器發(fā)送新的網頁。不觸發(fā)onload

增改記錄

  HTML5為history對象添加了兩個新方法,history.pushState()和history.replaceState(),用來在瀏覽歷史中添加和修改記錄。state屬性用來保存記錄對象,而popstate事件用來監(jiān)聽history對象的變化

  [注意]ie9不支持

 【pushState()】

    history.pushState()方法向瀏覽器歷史添加了一個狀態(tài)。pushState()方法帶有三個參數:一個狀態(tài)對象、一個標題(現(xiàn)在被忽略了)以及一個可選的URL地址

    history.pushState(state, title, url);

    state object —— 狀態(tài)對象是一個由pushState()方法創(chuàng)建的、與歷史紀錄相關的javascript對象。當用戶定向到一個新的狀態(tài)時,會觸發(fā)popstate事件。事件的state屬性包含了歷史紀錄的state對象。如果不需要這個對象,此處可以填null

    title —— 新頁面的標題,但是所有瀏覽器目前都忽略這個值,因此這里可以填null

    URL —— 這個參數提供了新歷史紀錄的地址。新URL必須和當前URL在同一個域,否則,pushState()將丟出異常。這個參數可選,如果它沒有被特別標注,會被設置為文檔的當前URL

    假定當前網址是example.com/1.html,使用pushState方法在瀏覽記錄(history對象)中添加一個新記錄

var stateObj = { foo: 'bar' };
history.pushState(stateObj, 'page 2', '2.html');

    添加上面這個新記錄后,瀏覽器地址欄立刻顯示example.com/2.html,但并不會跳轉到2.html,甚至也不會檢查2.html是否存在,它只是成為瀏覽歷史中的最新記錄。假如這時訪問了google.com,然后點擊了倒退按鈕,頁面的url將顯示2.html,但是內容還是原來的1.html。再點擊一次倒退按鈕,url將顯示1.html,內容不變

    總之,pushState方法不會觸發(fā)頁面刷新,只是導致history對象發(fā)生變化,地址欄的顯示地址發(fā)生變化

    如果pushState的url參數,設置了一個新的錨點值(即hash),并不會觸發(fā)hashchange事件,,即使新的URL和舊的只在hash上有區(qū)別

    如果設置了一個跨域網址,則會報錯。這樣設計的目的是,防止惡意代碼讓用戶以為他們是在另一個網站上

  【replaceState()】

  history.replaceState方法的參數與pushState方法一模一樣,不同之處在于replaceState()方法會修改當前歷史記錄條目而并非創(chuàng)建新的條目

  假定當前網頁是example.com/example.html

history.pushState({page: 1}, 'title 1', '?page=1');
history.pushState({page: 2}, 'title 2', '?page=2');
history.replaceState({page: 3}, 'title 3', '?page=3');
history.back()
// url顯示為http://example.com/example.html?page=1
history.back()
// url顯示為http://example.com/example.html
history.go(2)
// url顯示為http://example.com/example.html?page=3

  【state】

  history.state屬性返回當前頁面的state對象

history.pushState({page: 1}, 'title 1', '?page=1');
history.state// { page: 1 }

  【popstate事件】

  每當同一個文檔的瀏覽歷史(即history對象)出現(xiàn)變化時,就會觸發(fā)popstate事件

  [注意]需要注意的是,僅僅調用pushState方法或replaceState方法,并不會觸發(fā)該事件,只有用戶點擊瀏覽器倒退按鈕和前進按鈕,或者使用javascript調用back()、forward()、go()方法時才會觸發(fā)。另外,該事件只針對同一個文檔,如果瀏覽歷史的切換,導致加載不同的文檔,該事件也不會觸發(fā)

  使用的時候,可以為popstate事件指定回調函數。這個回調函數的參數是一個event事件對象,它的state屬性指向pushState和replaceState方法為當前URL所提供的狀態(tài)對象(即這兩個方法的第一個參數)

  上面代碼中的event.state,就是通過pushState和replaceState方法,為當前URL綁定的state對象

  這個state對象也可以直接通過history對象讀取

  var currentState = history.state;

往返緩存

  默認情況下,瀏覽器會在當前會話(session)緩存頁面,當用戶點擊“前進”或“后退”按鈕時,瀏覽器就會從緩存中加載頁面

  瀏覽器有一個特性叫“往返緩存”(back-forward cache或bfcache),可以在用戶使用瀏覽器的“后退”和“前進”按鈕時加快頁面的轉換速度。這個緩存中不僅保存著頁面數據,還保存了DOM和javascript的狀態(tài);實際上是將整個頁面都保存在了內存里。如果頁面位于bfcache中,那么再次打開該頁面時就不會觸發(fā)load事件

  [注意]IE10-瀏覽器不支持

  【pageshow】

  pageshow事件在頁面加載時觸發(fā),包括第一次加載和從緩存加載兩種情況。如果要指定頁面每次加載(不管是不是從瀏覽器緩存)時都運行的代碼,可以放在這個事件的監(jiān)聽函數

  第一次加載時,它的觸發(fā)順序排在load事件后面。從緩存加載時,load事件不會觸發(fā),因為網頁在緩存中的樣子通常是load事件的監(jiān)聽函數運行后的樣子,所以不必重復執(zhí)行。同理,如果是從緩存中加載頁面,網頁內初始化的JavaScript腳本(比如DOMContentLoaded事件的監(jiān)聽函數)也不會執(zhí)行

  [注意]雖然這個事件的目標是document,但必須將其事件處理程序添加到window

  pageshow事件有一個persisted屬性,返回一個布爾值。頁面第一次加載時或沒有從緩存加載時,這個屬性是false;當頁面從緩存加載時,這個屬性是true

  [注意]上面的例子使用了私有作用域,以防止變量showCount進入全局作用域。如果單擊了瀏覽器的“刷新”按鈕,那么showCount的值就會被重置為0,因為頁面已經完全重新加載了

  【pagehide】

  與pageshow事件對應的是pagehide事件,該事件會在瀏覽器卸載頁面的時候觸發(fā),而且是在unload事件之前觸發(fā)。與pageshow事件一樣,pagehide在document上面觸發(fā),但其事件處理程序必須要添加到window對象

  [注意]指定了onunload事件處理程序的頁面會被自動排除在bfcache之外,即使事件處理程序是空的。原因在于,onunload最常用于撤銷在onload中所執(zhí)行的操作,而跳過onload后再次顯示頁面很可能就會導致頁面不正常

  pagehide事件的event對象也包含persisted屬性,不過其用途稍有不同。如果頁面是從bfcache中加載的,那么persisted的值就是true;如果頁面在卸載之后會被保存在bfcache中,那么persisted的值也會被設置為true。因此,當第一次觸發(fā)pageshow時,persisted的值一定是false,而在第一次觸發(fā)pagehide時,persisted就會變成true(除非頁面不會被保存在bfcache中)

window.onpagehide = function(e){
e = e || event;
console.log(e.persisted);
}

使用方法:

1、取消默認的返回操作

function pushHistory(){
 var state = {
    title: "title",
    url: "#"   
  }
 window.history.pushState(state, "title", "#");  
}

pushHistory()

2、history.js用于兼容html4,也可以監(jiān)聽pushState與replaceSate

到此,關于“javascript中的History對象怎么用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

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

AI