BOM之history對象(轉)

来源:http://www.cnblogs.com/yangshuaiGo/archive/2017/02/10/6386060.html
-Advertisement-
Play Games

前面的話 history對象保存著用戶上網的歷史記錄,從視窗被打開的那一刻算起。由於安全方面的考慮,開發人員無法得到用戶瀏覽器的URL,但藉由用戶訪問過的頁面列表,可以在不知道實際URL的情況下實現後退和前進。本文將詳細介紹BOM中的history對象 length history.length屬性 ...


前面的話

  history對象保存著用戶上網的歷史記錄,從視窗被打開的那一刻算起。由於安全方面的考慮,開發人員無法得到用戶瀏覽器的URL,但藉由用戶訪問過的頁面列表,可以在不知道實際URL的情況下實現後退和前進。本文將詳細介紹BOM中的history對象

 

length

  history.length屬性保存著歷史記錄的URL數量。初始時,該值為1。如果當前視窗先後訪問了三個網址,history.length屬性等於3

  由於IE10+瀏覽器在初始時返回2,存在相容性問題,所以該值並不常用

history.length // 初始時,該值為1
history.length // 訪問三個網址後,該值為3

 

跳轉方法

  history對象提供了一系列方法,允許在瀏覽歷史之間移動,包括go()、back()和forward()

【go()】

  使用go()方法可以在用戶的歷史記錄中任意跳轉。這個方法接收一個參數,表示向後或向前跳轉的頁面數的一個整數值。負數表示向後跳轉(類似於後退按鈕),正數表示向前跳轉(類似於前進按鈕)

複製代碼
//後退一頁
history.go(-1)
//前進一頁
history.go(1);
//前進兩頁
history.go(2);
複製代碼

  go()方法無參數時,相當於history.go(0),可以刷新當前頁面

//刷新當前頁面
history.go();
//刷新當前頁面
history.go(0);

【back()】

  back()方法用於模仿瀏覽器的後退按鈕,相當於history.go(-1)

【forward()】

  forward()方法用於模仿瀏覽器的前進按鈕,相當於history.go(1)

//後退一頁
history.back()
//前進一頁
history.forward()

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

  [註意]使用歷史記錄時,頁面通常從瀏覽器緩存之中載入,而不是重新要求伺服器發送新的網頁

 

增改記錄

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

  [註意]IE9-瀏覽器不支持

【pushState()】

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

history.pushState(state, title, url);
state object —— 狀態對象是一個由pushState()方法創建的、與歷史紀錄相關的javascript對象。當用戶定向到一個新的狀態時,會觸發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方法不會觸發頁面刷新,只是導致history對象發生變化,地址欄的顯示地址發生變化

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

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

// 報錯
history.pushState(null, null, 'https://twitter.com/hello');

【replaceState()】

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

  假定當前網頁是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對象)出現變化時,就會觸發popstate事件

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

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

window.onpopstate = function (event) {
  console.log('location: ' + document.location);
  console.log('state: ' + JSON.stringify(event.state));
};

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

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

var currentState = history.state;

 

往返緩存

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

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

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

【pageshow】

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

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

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

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

複製代碼
(function(){
    var showCount = 0;
    window.onload = function(){
        console.log('loaded');
    }
    window.onpageshow = function(e){
        e = e || event;
        showCount ++;
        console.log(e.persisted,showCount + 'times');
    }
})();
複製代碼

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

【pagehide】

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

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

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

window.onpagehide = function(e){
    e = e || event;
    console.log(e.persisted);
}
轉自http://www.cnblogs.com/xiaohuochai/p/6379546.html 好的文章分享下 ~ 感謝藍色小火柴 最近比較忙, 會趕緊抽空寫微博噠~

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ...
  • 前言:無所不能的JavaScript JavaScript起源於Netscape公司的LiveScript語言,這是一種基於對象和事件驅動的客戶端腳本語言,最初的設計是為了檢驗HTML表單輸入的正確性,只是用於網頁開發的一個弱類型腳本語言。隨著Html5在PC和移動端越來越流行,JavaScript ...
  • 在高級應用中需要依靠js閉包(closure)來實現~ 1.變數的作用域:全局變數和局部變數。 Javascript可以在函數內部直接讀取全局變數。 var a=1; //全局變數 var c=2; //運行方法a1後 c被賦值為3 function a1(){ alert(a); //可獲得全局變 ...
  • 迴圈處理是最常見的編程模式之一,也是提升性能必須關註的要點之一。 常見的優化方案有: ①JavaScript的四種迴圈(for、do-while、while、for-in)中,for-in迴圈比其他幾種明顯要慢。由於每次迭代操作會同時搜索實例或原型屬性,for-in迴圈的每次迭代都會產生更多的開銷, ...
  • 破裂圖像 當我們img的src請求失敗的時候,會觸發 事件。這給我們提供了一個處理錯誤圖片的時機,但是很顯然這樣的處理對我們來說太昂貴了。 於是圖片就成了這樣: 這樣很顯然比較難看。 優雅的處理 這時候給我們的圖片添加下麵一些CSS,立馬就會和諧起來。 替換原有的破裂圖片 雖然上面已經相對優雅的處理 ...
  • 項目中突然需要使用複製功能,在網上搜索了下看到了ZeroClipboard插件,好用,但是也有局限。用法如下: 1、引用jquery、zclip.js、swf文件。demo地址:https://github.com/chaoli920029342/jquery_copy 2、初始化 註: 1、需在服 ...
  • 聲明:本文轉自露兜博客 在開始製作WordPress主題之前,首先得瞭解WordPress主題到底由哪些文件構成,你得清楚WordPress程式是怎樣與主題文件連接的。 以下是WordPress預設主題default文件夾下的所有模板文件。看了下圖,可能你還摸不著頭腦,到底這些文件是乾什麼的。Wor ...
  • 都轉爛了,不過還是貼上來了。查的時候方便。。。1. oncontextmenu="window.event.returnValue=false" 將徹底屏蔽滑鼠右鍵 <table border oncontextmenu=return(false)> <td>no </table> 可用於Table ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...