1. 程式人生 > >如何控制瀏覽器的歷史記錄

如何控制瀏覽器的歷史記錄

提醒:本文最後更新於 3779 天前,文中所描述的資訊可能已發生改變,請謹慎使用。

上次一位網友在我blog留言問到如何修正Ajax後退失效,這是在開發Ajax應用時很常見的需求。這篇文章就簡單的介紹一下怎麼解決這個問題。

首先我們要清楚後退按鈕會失效的原因:使用Ajax時,頁面通過XMLHttpRequest來更新內容,並沒有Redirect,所以瀏覽器不會出現前進後退。這也是Ajax剛出來時遭到很多人批判的一個原因,其中細節可以參考這兩篇文章《Ajax: 99% Bad》、《AJAX的七宗罪》。這個問題其實跟Ajax無關,不過Ajax的出現使得一個頁面實現無重新整理更新更容易,這個時候人們開始意識到,一個頁面發生巨大改變而不能後退是一件很痛苦的事情。

要解決這個問題,就要控制瀏覽器的history,在頁面發生改變時往瀏覽器歷史裡插入一條記錄。但是出於安全的目的,JS是不能直接操作history的。我們必須採用其他方法:IE中,在頁面中插入一個隱藏的iframe,通過改變iframe的location或者DOM,都可以在主視窗的history中產生新記錄,詳細研究可以參考這篇文章;在其他瀏覽器(Firefox、Opera、Safari)中沒有這麼複雜,只需改變url就可以產生一條新的history記錄,當然url不能亂改,要不頁面就跳轉走了,通常我們改變的是location.hash,也就是url“#”以後的部分。下面是具體實現:

首先在頁面中放一個隱藏的iframe:

<style type="text/css" title="default" media="screen">
#history_iframe{position:absolute;top:0; left:0;width:1px; height:1px;visibility:hidden}
</style>
<iframe id="history_iframe" src="blank.html"></iframe>

blank.html的內容也很簡單,放了一個div來存當前的hash:

<html>
  <head><title
>
hack iframe</title></head> <body><div id="state"></div></body> </html>

對不同瀏覽器採用不同方法控制history:

var isIE = typeof(window.opera)!="object"&&window.navigator.userAgent.indexOf("MSIE")>0;
var $ = function(s){return document.getElementById(s)};
function update_status(str){
  if(isIE){
    try{
      var doc = $("history_iframe").contentWindow.document;
      doc.open();
      doc.write('<html><body><div id="state">'+str+'</div></body></html>');
      doc.close();
    }catch(e){}
  }
  location.hash = str;
};

可以測試一下了:

<button onclick="update_status('test1')" >test1</button>
<button onclick="update_status('test2')" >test2</button>
<button onclick="update_status('test3')" >test3</button>

上面就是控制瀏覽器history的基本原理,通過點選三個按鈕,會往瀏覽器寫入三條歷史記錄,這樣儘管頁面依舊沒有重新整理,但是瀏覽器的前進後退卻能開始工作了。剩下的工作很簡單:利用一個定時器不停的檢測狀態是否發生變化(IE檢測iframe裡state的innerText;其他瀏覽器檢測location.hash),然後在檢測到狀態改變時呼叫相應的方法還原頁面內容。限於篇幅,這一部分程式碼就不貼出來了。完整的例項在這裡

--EOF--

提醒:本文最後更新於 3779 天前,文中所描述的資訊可能已發生改變,請謹慎使用。

相關推薦

js之添加瀏覽器歷史記錄

ssi 瀏覽器歷史記錄 sig per 錄取 地址欄 一個 url pla 如何生成一條歷史記錄 簡單粗暴的方法,直接在當前頁面的地址欄中輸入地址 點擊頁面中有a標簽的href 執行location.href = ‘xxx’(location.replace(‘xxx’)

理解瀏覽器歷史記錄(2)-hashchange、pushState

閱讀目錄 本文也是一篇基礎文章。繼上文之後,本打算去研究pushState,偶然在一些資訊中發現了錨點變化對瀏覽器的歷史記錄也會影響,同時錨點的變化跟pushState也有一些關聯。所以就花了點時間,把這兩個東西儘量都琢磨清楚。本文記錄相關的一些要點及研究過程。 1.

HTML5的popstate、pushState、replaceState如何玩轉瀏覽器歷史記錄

一、popstate用來做什麼的? 簡而言之就是HTML5新增的用來控制瀏覽器歷史記錄的api。 二、過去如何操縱瀏覽器歷史記錄? window.history物件,該物件上包含有length和state的兩個值,在它的__proto__上繼承有back、forward、g

瀏覽器歷史記錄查詢

針對谷歌,IE,360,QQ,搜狗,火狐等瀏覽器的歷史記錄做個筆記 除IE外,其他五個都是sqlite.db檔案形式儲存,具體路徑如下 谷歌:C:\Users\Administrator\AppDa

微信靜默授權增加瀏覽器歷史記錄導致跳轉死迴圈的解決方案

產生原因 示例程式碼 let urlArray=queryURLParameter(location.href); let urlCode=urlArray.code;//通過url獲取到的code

使用 JavaScript 操作瀏覽器歷史記錄 API

History 是 window 物件中的一個 JavaScript 物件,它包含了關於瀏覽器會話歷史的詳細資訊。你所訪問過的 URL 列表將被像堆疊一樣儲存起來。瀏覽器上的返回和前進按鈕使用的就是 history 的資訊。 History 物件包含長度屬性,它包含了會話歷史記錄棧中的 URL 數量。例如,

基於CefSharp開發瀏覽器(九)瀏覽器歷史記錄彈窗面板

一、前言 前兩篇文章寫的是關於瀏覽器收藏夾的內容,因為收藏夾的內容不會太多,故採用json格式的文字檔案作為收藏夾的儲存方式。 關於瀏覽器歷史記錄,我個人每天大概會開啟百來次網頁甚至更多,時間越長曆史記錄會越多多。此時使用json儲存一旦資料量加大,勢必會影響效率。 故需要選擇一個新的儲存方式。展開思考:Ed

如何控制瀏覽器歷史記錄

提醒:本文最後更新於 3779 天前,文中所描述的資訊可能已發生改變,請謹慎使用。 上次一位網友在我blog留言問到如何修正Ajax後退失效,這是在開發Ajax應用時很常見的需求。這篇文章就簡單的介紹一下怎麼解決這個問題。 首先我們要清楚後退按鈕會失效的原因:使用Ajax時,頁面通過XMLHttpR

IE、Chrome等的歷史記錄是什麼控制元件

c#如何做簡訊互動開發有沒有好的參考材料或經驗引導啊關於ArcGIS開發的幾點疑問c#如何做簡訊互動開發有沒有好的參考材料或經驗引導啊關於ArcGIS開發的幾點疑問 求教winform做的DataGridView,開啟窗體時為什麼啟動顯示這麼慢執行緒同步物件AutoReset

Android接入WebView(四)——瀏覽器書籤與歷史記錄詳細處理

最近寫了一個基於webview和zxing,sqlite實現的一款瀏覽器 主要功能有:掃描二維碼以及開啟本地二維碼載入網頁,書籤和歷史記錄管理,無痕瀏覽,分享網址,分享網址二維碼,瀏覽器出錯自定義等功能。 前段時間很忙,現在終於有時間來寫寫書籤

搜索保存歷史記錄功能

tco eat image spl adding table layout sin ati 要點:就是緩存輸入的內容到 本地 下面就是實現保存 搜索內容到本地 和 清空本地歷史的 方法 //保存搜索內容到本地 public void save() { St

python基礎一 ------簡單隊列用作歷史記錄

但是 猜字遊戲 history 無限制 tor except exc rom [] #需求:測試歷史記錄,一個猜字遊戲,能在重新進入遊戲時查看輸入歷史# 1 #-*-coding:utf-8-*- 2 from random import randint 3 fro

oracle命令歷史記錄工具(rlwrap)

oracle命令歷史記錄工具(rlwrap)下載地址:https://github.com/hanslub42/rlwrap/releases1.安裝依賴包[[email protected]/* */ ~]# yum install readline-devel* -y2.安裝rlwrap工具[

新猜數字遊戲--查看歷史記錄

dump span utf style col pri 就會 tor 再次 猜數字遊戲,就是隨機生成一個數字,猜這個數字的大小,輸入的值會有提醒比真值大還是小。這個新是說通過加入隊列來實現了可以查看之前輸入過得值。 1 # encoding = utf-8 2 fro

linux下ipython無法保存歷史記錄

eve red usr centos7 edit blog pytho centos yum安裝 在Centos7下使用ipython時,發現有個warning,提示無法保存歷史記錄 [[email protected]/* */ pip-9.0.1]# ip

清除 SQL Server Management Studio 服務器名稱歷史記錄

清除 text src 歷史 padding 效果 用戶 前言 文件 ? 前言 在開發過程中,經常使用 SQL Server Management Studio 連接本地或遠程 SQL Server 服務器,時間長了可能有些名稱就不用了或者重復了,SQL Server M

Ubuntu 16.04清楚Dash歷史記錄

color 安全 sqlit class div img activity mage daemon 1、【系統設置】->【安全和隱私】->【文件和應用】->【清除使用數據】 2、清楚播放記錄 rm -v ~/.local/share/recen

selenium_webdriver(python)控制瀏覽器滾動條

() sel import clas odin fin 滾動 -h firefox 調過JS腳本控制 #coding=utf-8 from selenium import webdriver import time #訪問百度 driver=

python爬取七星彩的開獎歷史記錄

clas 程序代碼 aip dal zip file utf mage decode 1.因為人不可能一直無休止的學習,偶爾也想做點兒別的,昨天無聊就想寫寫Python,當然我承認我上班後基本都是在學工作方面的事情,在這個崗位我也呆了三年多了,還是那句話問我什麽會不會我會給

清理清理火狐歷史記錄

bat@echo off ::輸出當前時間和日期 echo %date%%time% >>D:\scripts\cleanfirefoxhistory.log ::查找E:\XA65DATA\AppFolders文件夾及其子文件夾下所有後綴名為.sqlite文件並輸出重定向到D:\scripts\