AJAX使用技巧:如何處理書簽和翻頁按扭

来源:http://www.cnblogs.com/aspnetjia/archive/2016/02/04/5182188.html
-Advertisement-
Play Games

本篇文章提供了一個開源JavaScript庫,它提供了給AJAX應用程式中添加書簽和會退按鈕的功能。在學習完這個教程後,開發者將能夠對開發AJAX應用碰到的問題獲得一個解決方案,這個特性甚至Google Maps 和 Gmail 現在都不提供:提供一個強大的,可用的書簽和前進回退按鈕,如同其他的WE


本篇文章提供了一個開源JavaScript庫,它提供了給AJAX應用程式中添加書簽和會退按鈕的功能。在學習完這個教程後,開發者將能夠對開發AJAX應用碰到的問題獲得一個解決方案,這個特性甚至Google Maps 和 Gmail 現在都不提供:提供一個強大的,可用的書簽和前進回退按鈕,如同其他的WEB應用一樣的行為。

AJAX“如何處理書簽和回退按鈕”闡述了AJAX應用程式開發書簽和回退按鈕功能碰到的嚴重的問題;可以解決以上問題的一個開源框架,並提供真實、簡單的歷史記錄庫,還提供了幾個運行中的例子。

本文把這個框架提供的重要發現分兩個部分來說明:首先,一個隱藏的HTML表單用來緩存大量短暫的在客戶端信息。這些緩存為網頁導航提供了強大的支持。其次,一個隱藏的IFrame和超級鏈接用來截取和記錄瀏覽器的歷史事件提供回退按鈕和向前按鈕的支持。以上兩個技術都是通過包裝在一個簡單的JavaScript庫中來實現簡單開發。

問題:書簽和回退按鈕在傳統的多頁面的Web應用程式中工作的非常好。當用戶瀏覽網站的時候,瀏覽器的地址欄記錄隨新的URLs更新,這些記錄可以拷貝到email 或者 書簽中供以後使用。回退和前進按鈕可以幫助用戶在他瀏覽過的網頁中向前或向後翻動。

AJAX 應用程式卻是不同的,他們是運行在一個網頁中的複雜程式。瀏覽器並不是為這類程式製作的———這類程式是過去的,在每次滑鼠點擊的時候需要重新刷新整個頁面。

在類似Gmail的AJAX軟體中,瀏覽器的地址欄在用戶選擇功能和改變程式狀態的時候保持不變,這讓書簽在這類程式中無法使用。未來,如果用戶按下“回退”按鈕來撤銷上次的動作,而瀏覽器和應用程式分離的狀況會讓用戶很吃驚。

解決方案:開源Really Simply History (RSH)框架可以用來解決上面的問題,為AJAX應用程式提供書簽和控制“回退”、“向前”按鈕的功能。RSH 目前還是Beta 狀態,可以在Firefox 1.0 , Netscape 7+,Internet Explorer 6+等瀏覽器上工作,目前還不支持Safari瀏覽器。可以參考:編碼天堂:Safari:不可能的DHTML歷史記錄。

有幾類AJAX框架目前也支持書簽和歷史訪問的問題,但這些框架因為實現方式的不同,目前都有幾個大Bug。未來,很多AJAX框架,比如Backbase 和 Dojo 將會整合歷史瀏覽的功能;這些框架為AJAX應用程式採用完全不同的編程模型,強迫程式員使用完全不同的方式來實現歷史瀏覽的功能。

相反,RSH 是一個可以包含在現有AJAX系統的單模塊。未來,RSH庫會進一步改進避免和其他框架的相關功能衝突。

RSH 歷史框架由兩個JavaScript類組成:DhtmlHistory 和 HistoryStorage。

DhtmlHistory 類為AJAX應用程式提供歷史瀏覽記錄的抽象。AJAX 頁面 add() 歷史瀏覽記錄事件到瀏覽器,保存指定新的地址和相關的歷史數據。DhtmlHistory 類使用Hash連接更新瀏覽器當前的URL,比如:#new-location,同時把歷史數據和新的URL關聯。AJAX 應用程式把自己註冊為歷史瀏覽的監聽器,當用戶使用 “前進”“回退”按鈕來瀏覽時,歷史瀏覽時間被觸發,調用 add() 方法來提供給瀏覽器新的地址,並保存歷史數據。

第二個類: HistoryStorage允許程式員保存任意的歷史瀏覽數據。在普通的網頁中,當用戶瀏覽到一個新的網址,瀏覽器卸載並清除當前網頁所有的程式和JavaScript狀態,如果用戶返回時,所有的數據都丟失了。HsitoryStorage 類提供帶有Hash表的API通過 put() , get() , hasKey() 等方法來解決這類問題。上面的方法允許程式員保存用戶離開網頁時的任意數據,當用戶按“回退”按鈕重新返回時,歷史數據可以通過HistoryStorage類來訪問。我們起初通過使用隱藏的表單欄位來實現,因為瀏覽器自動保存一個表單中欄位值,甚至用戶離開網頁的時候也如此。

例子:先從一個簡單的例子開始吧:

首先,需要RSH框架的網頁中需要包含 dhtmlHistory.js 教本:

src="../../framework/dhtmlHistory.js">

DHTML 歷史應用程式必須在同級目錄下包含blank.html文件。這個文件自動被RSH框架綁定需要被IE瀏覽器使用。正如剛纔提到的,RSH使用一個隱藏的Iframe來保存和增加IE瀏覽器的改變。這個Iframe需要指定一個實際的文件位置才能正常工作,這就是blank.html。

RSH 框架創建了一個叫dhtmlHistory的全局對象,這是控制瀏覽器歷史瀏覽記錄的入口點。第一步在網頁完成裝載後需要初始化 dhtmlHistory 對象。

window.onload = initialize; 
function initialize() { 
// initialize the DHTML History 
// framework 
dhtmlHistory.initialize();

然後,程式員使用 dhtmlHistory.addListener() 方法訂閱歷史瀏覽事件的改變。這個方法使用了一個JavaScript的回調函數,當記錄歷史瀏覽事件發生時這個函數接收兩個參數。網頁的新地址和任何的歷史數據都應該關聯到這個事件:

window.onload = initialize; 
function initialize() { 
// initialize the DHTML History 
// framework 
dhtmlHistory.initialize(); 
// subscribe to DHTML history change 
// events 
dhtmlHistory.initialize();

historyChange() 方法很直觀,當用戶瀏覽到一個新的網頁時使用一個方法接收 newLocation ,同時其他的 historyData 可以選擇附加到這個事件上:

/** Our callback to receive history change 
events. */ 
function historyChange(newLocation, 
historyData) { 
debug("A history change has occurred: " 
+ "newLocation="+newLocation 
+ ", historyData="+historyData, 
true); 
}

上面用到的Debug() 是一個工具方法,用來簡單的把消息列印到網頁上。第二個參數是Boolean型的,如果設置為真,在新的消息列印的時候將會清楚原來的信息。

Add() 方法。增加一個包含新地址的歷史事件,比如:“edit:SomePage”,同時也提供了和事件一起存儲的可選 historyDate 值。

window.onload = initialize; 
function initialize() { 
// initialize the DHTML History 
// framework 
dhtmlHistory.initialize(); 
// subscribe to DHTML history change 
// events 
dhtmlHistory.initialize(); 
// if this is the first time we have 
// loaded the page... 
if (dhtmlHistory.isFirstLoad()) { 
debug("Adding values to browser " 
+ "history", false); 
// start adding history 
dhtmlHistory.add("helloworld", 
"Hello World Data"); 
dhtmlHistory.add("foobar", 33); 
dhtmlHistory.add("boobah", true); 
var complexObject = new Object(); 
complexObject.value1 = 
"This is the first value"; 
complexObject.value2 = 
"This is the second value"; 
complexObject.value3 = new Array(); 
complexObject.value3 = new Array(); 
complexObject.value3[1] = ¡°array 2¡±; 
dhtmlHistory.add("complexObject", 
complexObject);

在add()執行後的同時,新的地址作為一個鏈接地址將顯示在瀏覽器的URL地址欄中。比如:在AJAX網頁中當前地址是: http://codinginparadise.org/my_ajax_app ,執行完: dhtmlHistory.add(“helloworld”,”Hello World Data”)後用戶將會在瀏覽器URL地址欄中看到如下的地址: http://codinginparadise.org/my_ajax_app#helloworld

這是用戶可以給這個頁面做收藏書簽,如果用戶後來用到這個書簽的時候,AJAX應用程式可以讀取到:#helloworld值並用它來初始化網頁。RSH框架透明的對URL地址值進行編碼和解碼。

historyData 在保存比較複雜狀態的時候很有用處。這是一個可選的值,他可以是JavaScript的任何類型,比如:數字,字元串,對象等。使用這個功能的一個例子是在一個網頁字元編輯器中,如果用戶離開當前網頁。當用戶回退時,瀏覽器將會把對象返回給歷史瀏覽變動監聽器。

開發者可以給historyData提供帶有嵌套對象和用數組表示的複雜JavaScript對象。然而,DOM對象和瀏覽器支持的腳本對象XMLHttpRequest,並不保存。註意:historyData 並不隨書簽一起持續化,當瀏覽器關閉,瀏覽器緩存被清除和用戶清除歷史記錄的時候,他也就消失了。

轉載自:http://www.aspnetjia.com


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

-Advertisement-
Play Games
更多相關文章
  • CREATE OR REPLACE PACKAGE BODY BASE_INFO AS PROCEDURE insert_lapc(lapc In lapc_array) AS v_max number; v_result number; v_status number; BEGIN delete
  • 1.安裝x window 使用apt get 安裝 xorg 如果提示以下內容,就說明需要update下源列表,使用 即可 2.安裝LXDE 3.安裝tight vnc 4.啟動一下vnc然後再退出,為了讓它生成配置文件 中間過程可能會要求你輸入一個 8位的 VNC密碼,輸密碼的過程中要記住這個密碼
  • 一般Linux系統,有兩個配置文件可以設置PATH變數,一:.bashrc 二:.bash_profile; 還有一種方法可以臨時設置PATH變數(三) 一: 1、編輯.bashrc,添加 export PATH=$PATH:/home/myname/mydirectory 這是將路徑跟在已有路徑後
  • 一.概述 1.環境:我這裡是2台linux機器(host1和host2),發行版是kali2.0,內核版本是4.3。每台機器都安裝Docker、OpenvSwitch(ovs)。 2.host1和host2分別啟動1個ubuntu的docker容器。 3.網路結構: 2.1:host1的eth0:1
  • 左上角幾個管腳分別是J601和J801 J601: 第一排兩個管腳:可以使用跳線帽短接,作用是: 連接:當電源接通後就自動啟動 斷開:需要按下最上面的中間那個小按鍵3~4秒才能啟動 第二排兩個管腳: 連接:可以燒寫第一階段的啟動載入程式到emmc,必須先把usb otg連接到PC機上。 斷開:從em...
  • 1. 背景知識 在多媒體的推動下,彩色LCD越來越多地應用到嵌入式系統中,PDA和手機等大多都採用LCD作為顯示器材,因此學習LCD的應用很有實際意義! LCD工作的硬體需求:要使一塊LCD正常的顯示文字或圖像,不僅需要LCD驅動器,而且還需要相應的LCD控制器。在通常情況下,生產廠商把LCD驅動器
  • 開發板自帶的LCD驅動是基於platform匯流排寫的,所以如果要使其它的LCD能夠在自己的開發板上跑起來,那麼就先瞭解platform驅動的架構,下麵簡單記錄下自己看platform驅動時體會,簡單的說platform是一種虛擬匯流排,那麼它也是一條匯流排,所以它分為3個部分,platform_bus,
  • 2.0自定義菜單管理 ①介面說明: 微信服務號聊天視窗下麵的菜單項(有的公眾號有啟用有的則沒有),這個可以在編輯模式簡單配置,也可以在開發模式代碼配置。微信公眾平臺開發者文檔:微信公眾號開發平臺創建自定義菜單,可以看到創建菜單的一些註意事項,下麵的使用網頁調試工具調試該介面,只是調試介面是否可以正常
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...