亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄 搜索
導(dǎo)論 前言 為什么學(xué)習(xí)JavaScript JavaScript的歷史 基本語法 語法概述 數(shù)值 字符串 對(duì)象 數(shù)組 函數(shù) 運(yùn)算符 數(shù)據(jù)類型轉(zhuǎn)換 錯(cuò)誤處理機(jī)制 JavaScript 編程風(fēng)格 標(biāo)準(zhǔn)庫 Object對(duì)象 包裝對(duì)象和Boolean對(duì)象 Number對(duì)象 String對(duì)象 Math對(duì)象 Date對(duì)象 RegExp對(duì)象 JSON對(duì)象 ArrayBuffer:類型化數(shù)組 面向?qū)ο缶幊?/a> 概述 封裝 繼承 模塊化編程 DOM Node節(jié)點(diǎn) document節(jié)點(diǎn) Element對(duì)象 Text節(jié)點(diǎn)和DocumentFragment節(jié)點(diǎn) Event對(duì)象 CSS操作 Mutation Observer 瀏覽器對(duì)象 瀏覽器的JavaScript引擎 定時(shí)器 window對(duì)象 history對(duì)象 Ajax 同域限制和window.postMessage方法 Web Storage:瀏覽器端數(shù)據(jù)儲(chǔ)存機(jī)制 IndexedDB:瀏覽器端數(shù)據(jù)庫 Web Notifications API Performance API 移動(dòng)設(shè)備API HTML網(wǎng)頁元素 Canvas API SVG 圖像 表單 文件和二進(jìn)制數(shù)據(jù)的操作 Web Worker 服務(wù)器發(fā)送事件 Page Visibility API Fullscreen API:全屏操作 Web Speech requestAnimationFrame WebSocket WebRTC Web Components HTML網(wǎng)頁的API HTML網(wǎng)頁元素 Canvas API SVG 圖像 表單 文件和二進(jìn)制數(shù)據(jù)的操作 Web Worker 服務(wù)器發(fā)送事件 Page Visibility API Fullscreen API:全屏操作 Web Speech requestAnimationFrame WebSocket WebRTC Web Components 開發(fā)工具 console對(duì)象 PhantomJS Bower:客戶端庫管理工具 Grunt:任務(wù)自動(dòng)管理工具 Gulp:任務(wù)自動(dòng)管理工具 Browserify:瀏覽器加載Node.js模塊 RequireJS和AMD規(guī)范 Source Map JavaScript 程序測(cè)試 JavaScript高級(jí)語法 Promise對(duì)象 有限狀態(tài)機(jī) MVC框架與Backbone.js 嚴(yán)格模式 ECMAScript 6 介紹 附錄 JavaScript API列表
文字

    • 概述

    • history.pushState(),history.replaceState()

    • history.state屬性

    • popstate事件

    • 參考鏈接

概述

瀏覽器窗口有一個(gè)history對(duì)象,用來保存瀏覽歷史。比如,該窗口先后訪問了三個(gè)地址,那么history對(duì)象就包括三項(xiàng),length屬性等于3。

history.length // 3

history對(duì)象提供了一系列方法,允許在瀏覽歷史之間移動(dòng)。

  • back():移動(dòng)到上一個(gè)訪問頁面,等同于瀏覽器的后退鍵。

  • forward():移動(dòng)到下一個(gè)訪問頁面,等同于瀏覽器的前進(jìn)鍵。

  • go():接受一個(gè)整數(shù)作為參數(shù),移動(dòng)到該整數(shù)指定的頁面,比如go(1)相當(dāng)于forward(),go(-1)相當(dāng)于back()。

history.back();
history.forward();
history.go(-2);

如果移動(dòng)的位置超出了訪問歷史的邊界,以上三個(gè)方法并不報(bào)錯(cuò),而是默默的失敗。

以下命令相當(dāng)于刷新當(dāng)前頁面。

history.go(0);

history.pushState(),history.replaceState()

HTML5為history對(duì)象添加了兩個(gè)新方法,history.pushState() 和 history.replaceState(),用來在瀏覽歷史中添加和修改記錄。所有主流瀏覽器都支持該方法(包括IE10)。

if (!!(window.history && history.pushState)){
  // 支持History API
} else {
  // 不支持
}

上面代碼可以用來檢查,當(dāng)前瀏覽器是否支持History API。如果不支持的話,可以考慮使用Polyfill庫History.js

history.pushState方法接受三個(gè)參數(shù),依次為:

  • state:一個(gè)與指定網(wǎng)址相關(guān)的狀態(tài)對(duì)象,popstate事件觸發(fā)時(shí),該對(duì)象會(huì)傳入回調(diào)函數(shù)。如果不需要這個(gè)對(duì)象,此處可以填null。

  • title:新頁面的標(biāo)題,但是所有瀏覽器目前都忽略這個(gè)值,因此這里可以填null。

  • url:新的網(wǎng)址,必須與當(dāng)前頁面處在同一個(gè)域。瀏覽器的地址欄將顯示這個(gè)網(wǎng)址。

假定當(dāng)前網(wǎng)址是example.com/1.html,我們使用pushState方法在瀏覽記錄(history對(duì)象)中添加一個(gè)新記錄。

var stateObj = { foo: "bar" };

history.pushState(stateObj, "page 2", "2.html");

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

注意,pushState方法不會(huì)觸發(fā)頁面刷新。

如果 pushState 的url參數(shù),設(shè)置了一個(gè)當(dāng)前網(wǎng)頁的#號(hào)值(即hash),并不會(huì)觸發(fā)hashchange事件。如果設(shè)置了一個(gè)非同域的網(wǎng)址,則會(huì)報(bào)錯(cuò)。

// 報(bào)錯(cuò)
history.pushState(null, null, 'https://twitter.com/hello');

上面代碼中,pushState想要插入一個(gè)非同域的網(wǎng)址,導(dǎo)致報(bào)錯(cuò)。這樣設(shè)計(jì)的目的是,防止惡意代碼讓用戶以為他們是在另一個(gè)網(wǎng)站上。

history.replaceState方法的參數(shù)與pushState方法一模一樣,區(qū)別是它修改瀏覽歷史中當(dāng)前頁面的值。假定當(dāng)前網(wǎ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

history.state屬性

history.state屬性保存當(dāng)前頁面的state對(duì)象。

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

popstate事件

每當(dāng)同一個(gè)文檔的瀏覽歷史(即history對(duì)象)出現(xiàn)變化時(shí),就會(huì)觸發(fā)popstate事件。需要注意的是,僅僅調(diào)用pushState方法或replaceState方法 ,并不會(huì)觸發(fā)該事件,只有用戶點(diǎn)擊瀏覽器倒退按鈕和前進(jìn)按鈕,或者使用JavaScript調(diào)用back、forward、go方法時(shí)才會(huì)觸發(fā)。另外,該事件只針對(duì)同一個(gè)文檔,如果瀏覽歷史的切換,導(dǎo)致加載不同的文檔,該事件也不會(huì)觸發(fā)。

使用的時(shí)候,可以為popstate事件指定回調(diào)函數(shù)。這個(gè)回調(diào)函數(shù)的參數(shù)是一個(gè)event事件對(duì)象,它的state屬性指向pushState和replaceState方法為當(dāng)前url所提供的狀態(tài)對(duì)象(即這兩個(gè)方法的第一個(gè)參數(shù))。

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

// 或者

window.addEventListener('popstate', function(event) {  
  console.log("location: " + document.location);
  console.log("state: " + JSON.stringify(event.state));  
});

上面代碼中的event.state,就是通過pushState和replaceState方法,為當(dāng)前url綁定的state對(duì)象。

這個(gè)state對(duì)象也可以直接通過history對(duì)象讀取。

var currentState = history.state;

另外,需要注意的是,當(dāng)頁面第一次加載的時(shí)候,在onload事件發(fā)生后,Chrome和Safari瀏覽器(Webkit核心)會(huì)觸發(fā)popstate事件,而Firefox和IE瀏覽器不會(huì)。

參考鏈接


上一篇: 下一篇: