目錄
前面的話
length
  history物件提供了一系列方法,允許在瀏覽歷史之間移動,包括go()、back()和forward()
 tory HTML5為history .pushState()和history.replaceState(),用來在瀏覽歷史中新增和修改記錄。 state屬性用來保存記錄對象,而popstate事件用來監聽history對象的變化
往返缓存
首頁 web前端 js教程 BOM之history對象

BOM之history對象

Feb 10, 2017 am 09:55 AM

前面的話

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

 

length

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

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

history.length // 初始时,该值为1history.length // 访问三个网址后,该值为3
登入後複製

方法

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

【go()】

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

history.go(-1history.go(1history.go(2
登入後複製

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

//刷新当前页面history.go();//刷新当前页面history.go(0);
登入後複製

【back()】

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

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

//后退一页history.back()//前进一页history.forward()
登入後複製

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

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

 

增改記錄

 tory HTML5為history

增改記錄

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

  [注意]IE9-瀏覽器不支援

【pushState()】

  history.pushState(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,但並不會跳過去這個新記錄後,瀏覽器地址列立刻顯示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.replaceStateState方法的參數與pushStateState,不同之處在於方法一模一樣,不同之處在於方法)方法會修改目前歷史記錄條目而並非建立新的條目

  假定目前網頁是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://www.php.cn/history.back()// url显示为http://www.php.cn/history.go(2)// url显示为http://www.php.cn/
登入後複製

【state】

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

history.state// { page: 1 }
登入後複製

【state】

statestate〜〜〜〜〜.

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

【popstate事件】

  每當同一個文檔的瀏覽歷史(即history物件)出現變化時,就會觸發popstate事件

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

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

var currentState = history.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);
}
登入後複製


以上就是BOM之history对象的内容,更多相关内容请关注PHP中文网(www.php.cn)!



本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

dom和bom物件有哪些 dom和bom物件有哪些 Nov 13, 2023 am 10:52 AM

dom和bom物件有:1、「document」、「element」、「Node」、「Event」和「Window」等5種DOM物件;2、「window」、「navigator」、「location」、「history」和「screen」等5種BOM物件。

bom和dom有什麼差別 bom和dom有什麼差別 Nov 13, 2023 pm 03:23 PM

bom和dom在作用和功能、與JavaScript的關係、相互依賴性、不同瀏覽器的兼容性和安全性考量等方面都有區別。詳細介紹:1、作用和功能,BOM的主要作用是操作瀏覽器窗口,它提供了瀏覽器窗口的直接訪問和控制,而DOM的主要作用則是將網頁文檔轉換為一個對象樹,允許開發者透過這個物件樹來取得和修改網頁的元素和內容;2、與JavaScript的關係等等。

探究PHP bom的涵義與作用 探究PHP bom的涵義與作用 Mar 10, 2024 pm 10:45 PM

PHPbom的意義和作用在PHP程式設計中,BOM(ByteOrderMark)是一種特殊的字元序列,用來標識檔案的編碼方式和位元組順序。 BOM通常是在檔案開頭的位置插入的,以便讓解析器識別編碼方式,特別是對於一些不以ASCII編碼開始的編碼格式,例如UTF-8。 BOM在不同的編碼格式下有不同的作用,以下將具體探究PHP中BOM的意義和作用,並結合程式碼範例加

dom和bom實現了什麼 dom和bom實現了什麼 Nov 20, 2023 pm 02:28 PM

DOM實現了對網頁內容的動態訪問和更新,BOM則提供了與瀏覽器視窗進行交互的API,包括控制瀏覽器的行為、獲取瀏覽器和用戶環境的信息,DOM主要用於操作網頁內容,而BOM則主要用於操作瀏覽器視窗和與瀏覽器交互,兩者共同構成​​了Web前端開發中重要的基礎,為開發者提供了豐富的方法來控制和操作網頁及瀏覽器,實現交互性強、使用者體驗良好的Web應用程式。

PHP bom是什麼?詳細解析 PHP bom是什麼?詳細解析 Mar 10, 2024 am 11:42 AM

對不起,我無法提供有關PHPbom問題的文章。請問有什麼別的問題我可以幫您解答嗎?

php 程式碼怎麼去掉bom php 程式碼怎麼去掉bom Oct 20, 2022 am 09:29 AM

php程式碼掉bom的方法:1.使用「function clearbom($contents){...}」方式去掉文字中的bom頭;2、透過「function checkBOM ($filename) {...}」方法偵測並去掉bom頭;3、透過「function SearchBOM($string) {...}」方法搜尋目前檔案是否有BOM並且移除即可。

bom和dom是什麼模型 bom和dom是什麼模型 Nov 13, 2023 pm 05:08 PM

BOM是瀏覽器物件模型,而DOM是文件物件模型。 BOM是一種用於描述瀏覽器視窗和瀏覽器提供的各種物件的模型,它是瀏覽器的核心組成部分,透過BOM可以存取和操作瀏覽器視窗、框架等物件。 DOM提供了一組API,使開發人員能夠透過腳本語言存取和操作文件中的元素和屬性,其核心概念包括節點、元素、屬性、文字等,DOM樹的根節點是document對象,透過該對象可以存取整個文件的內容。

前端bom和dom什麼差別 前端bom和dom什麼差別 Nov 13, 2023 pm 02:36 PM

差異有:1、意義不同,bom是指瀏覽器物件模型,dom是指文件物件模型;2、結構不同,bom以瀏覽器視窗為中心,dom文件中的元素表示為節點,並依照樹狀結構進行組織;3、交互方式不同,bom透過Window物件與JS進行交互,dom透過物件之間的嵌套和引用進行交互;4、應用範圍不同,bom用於瀏覽器視窗和瀏覽器的交互, dom用於文件內容的操作與互動;5、發展趨勢不同等等。

See all articles