標籤:
flexflashbrowsermanagerhistorymanagerit |
分類: Flex |
flex這兩個類是用來處理和瀏覽器相關對象的交互,類似HTML的history,location對象,以下是詳細解析:
HistoryManager功能在Flex項目中是默認打開的,比如在使用Accordion 和 TabNavigator組件時,在不同區域切換時,Flex會自動記錄下各個狀態,我們可以通過點擊瀏覽器的“前進”和“後退”按鈕來前進和倒退,在你切換這些組件的區域時,Flex會自動你在網頁鏈接的後面加寫參數,以便記錄當前頁面的狀態。
默認情況下HistoryManager的功能是打開的,你可以通過設置各個組件或Application的historyManagementEnabled屬性爲false(默認爲TRUE)來關閉此功能。
這些都沒什麼好講的。關鍵是怎麼在一些普通組建上使用HistoryManager功能,默認的navigator container組建都是支持該功能的。要使一些普通組建也支持此功能,必須:
1.實現mx.managers.IHistoryManagerClient接口。
2.用HistoryManager'的register()方法爲組建註冊。
3.當組件狀態改變時保存組件的狀態。
4.通過實施IHistoryManagerClient的saveState() 和 loadState()方法來保存和讀取組件狀態。
拿CheckBox爲例:
<?xml version="1.0"?>
<mx:CheckBox
xmlns:mx="http://www.adobe.com/2006/mxml"
label="Check me"
implements="mx.managers.IHistoryManagerClient" //關鍵步驟1,實現接口
creationComplete="mx.managers.HistoryManager.register(this);"//關鍵步驟2,註冊組件
change="boxChanged(event)"//關鍵步驟3,當組件發生變化時保存狀態
>
<mx:Script><![CDATA[
import mx.managers.HistoryManager;
//實施IHistoryManagerClient的saveState()方法保存狀態
public function saveState():Object {
return {selected:selected};
}
//實施IHistoryManagerClient的loadState()方法讀取狀態
public function loadState(state:Object):void {
var newState:Boolean = state;
if (newState != selected) {
selected = newState;
} else {
if (newState) {
;
} else {
selected = true;
}
}
}
// 保存狀態
private function boxChanged(e:Event):void {
HistoryManager.save();
}
]]></mx:Script>
</mx:CheckBox>
注意:如果你把實現HistoryManager功能的組件放到module中,再在主程序中調用,那麼HistoryManager功能是沒用的。
麻雀雖小,五臟俱全。上面例子就是如何讓任意組件實現HistoryManager的典型案例。點擊瀏覽器的“前進”和“後退”來恢復上個或下個狀態。
可以通過BrowserManager類的getInstance()方法來獲得其一個實施了IBrowserManager接口的實例。這樣就可以訪問其setTitle()和setFragment()方法和屬性了。下面我就來介紹一下BrowserManager類的一些屬性和方法。
方法:
1.init(fragment,title)
該方法可以定義默認的鏈接參數和網頁標題。一般在初始化時用到。例如:
browserManager.init("", "Test Deep Linking");定義了參數爲空,標題爲Test Deep Linking的網頁。
2.setTitle(title)
該方法用來設置網頁標題。例如:
browserManager.setTitle("The New Title") 設置網頁標題爲“The New Title”。
3.setFragment(fragment)
該方法用來設置網頁參數。例如:
browserManager.setFragment("id=3") 設置參數“id=3”。
屬性:
1.url
browserManager.url獲得頁面完整鏈接。
2.base
browserManager.base獲得頁面基地址。
3.fragment
browserManager.fragment獲得頁面鏈接#後的參數。
4.lastURL
browserManager.lastURL獲得上一個頁面鏈接——IE6我獲得是失敗的,火狐正確。大家可以自己試試。
注意:上面的browserManager便是BrowserManager類的一個實例。實例化過程如下:
import mx.events.BrowserChangeEvent;
import mx.managers.IBrowserManager;
import mx.managers.BrowserManager;
private var browserManager:IBrowserManager;
private function initApp():void {
browserManager = BrowserManager.getInstance();
browserManager.addEventListener(BrowserChangeEvent.BROWSER_URL_CHANGE, parseURL);
browserManager.init("", "Test Deep Linking");
}
如何分析URl
可以用URLUtil類方便的分析Url
類路徑mx.utils.URLUtil,例如鏈接:http://127.0.0.1/index.html#a=3&b=1
var o:Object = URLUtil.stringToObject(browserManager.fragment,"&");
trace(o.a,o.b)
反過來設置地址欄鏈接:
o.a=5;o.b=7;
var s:String = URLUtil.objectToString(o,"&");
browserManager.setFragment(s);
注意:如果 URLUtil.objectToString()方法第二個參數爲空,那麼默認的參數分隔符爲";"號。
BrowserManager類的事件
BrowserManager類有三種事件:
1.applicationURLChange事件;
當在程序執行時調用setFragment()等方法改變URL時派發此事件。
2.browserURLChange事件;
當手動改變瀏覽器鏈接或點擊“前進”或“後退”時派發此事件。
3.urlChange事件;
applicationURLChange事件或browserURLChange事件派發時,都將觸發該事件。
獲得鏈接信息
可以通過BrowserManager類的屬性和URLUtil的一些方法來獲得鏈接信息,例如:
var url:String = browserManager.url;
baseURL = browserManager.base;
fragment = browserManager.fragment;
previousURL = e.lastURL;
fullURL = mx.utils.URLUtil.getFullURL(url, url);
port = mx.utils.URLUtil.getPort(url);
protocol = mx.utils.URLUtil.getProtocol(url);
serverName = mx.utils.URLUtil.getServerName(url);
isSecure = mx.utils.URLUtil.isHttpsurl(/url);