Flex Accordion 和 TabNavigator组件浏览器跳转问题
【文章出處】http://xinzy.iteye.com/blog/474778?
最近做flex項(xiàng)目的時候,發(fā)現(xiàn)退出登陸時URL上會自動加上一個“#”字符,很奇怪,Google+Baidu無數(shù)次都沒有找到答案。今天無意間看到幾個群友在說通過“BrowserManager”獲取URL,于是仔細(xì)查看了API,又發(fā)現(xiàn)了“HistoryManager”,這個問題終于明白了。?
我 們通常看的Web頁面 可以通過瀏覽器的“前進(jìn)”“后退”來查看剛才看過的頁面,同樣,嵌入的頁面中的flash也可以實(shí)現(xiàn)這樣的功能。方法是通過 HistoryManageer類和BrowserManager類兩種方法來實(shí)現(xiàn)。HistoryManageer類主要是用在Flex2,Flex3 后很少用了。待會我將分別介紹這兩種方法。?
回到剛才說URL上自動加“#”號的問題:原因是Application 默認(rèn)historyManagementEnabled屬性是ture,也就是說HistoryManageer類功能自動開啟了,Application 里面通過程序控制addChild或removeChild任何組件所導(dǎo)致的變化,將會記錄在flash的history中,導(dǎo)致重寫url,加上“#” 字符。故有了這個奇怪的“#”號。在Flex3中,HistoryManager功能在Flex項(xiàng)目中默認(rèn)打開的還有Accordion 和 TabNavigator組件。對于沒有默認(rèn)打開該功能的組件,如果要實(shí)現(xiàn)該功能,則需要另外注冊。下面引用兩片文章加以說明:?
對于一個網(wǎng)站來說,其是有若干個網(wǎng)頁組成的。而各個網(wǎng)頁之間的鏈接叫做超鏈接。鏈接成為網(wǎng)頁和網(wǎng)頁之間的橋梁。那么,對于一個Flash整站來說,有沒有一個辦法來實(shí)現(xiàn) Flash各頁面(更恰當(dāng)?shù)恼f是各功能模塊)之間的鏈接呢。比如,我想在瀏覽器中輸入一個鏈接便可以鏈到Flash整站中的一頁—一個功能模塊,而不是每次都要通過Flash整站的第一個頁面的功能導(dǎo)航進(jìn)入。把Flash的各個功能塊頁面化,那么我們該怎么實(shí)現(xiàn)呢。到底能不能實(shí)現(xiàn)呢??
答案是肯定的,通過Flex Deep Link 便能實(shí)現(xiàn)上述功能。?
Flex Deep Link(深鏈接)-第一,Deep Link 簡介。?
Deep Link其實(shí)也是依賴Flash和瀏覽器的交互來實(shí)現(xiàn)的,通過獲取鏈接地址中#后面的參數(shù)來實(shí)現(xiàn)頁面標(biāo)記,當(dāng)你在Flex Bulid3發(fā)布一個項(xiàng)目時,其會自動你發(fā)布的目錄生成一個名為History的文件夾,里面有 History.js,HistoryFrame.html,history.css這三個文件,可見Deep Link也是通過和瀏覽器交互來實(shí)現(xiàn)的.如果瀏覽器不支持JavaScript或者禁用JavaScript,那么Deep LinK肯定是不能用的。?
對于Deep Link應(yīng)用,最重要的就是學(xué)會應(yīng)用BrowserManager和HistoryManager這兩個類。我們由簡單到困難,先講一講HistoryManager這個類的應(yīng)用。?
Flex Deep Link(深鏈接)-? 第二,HistoryManager。?
HistoryManager功能在Flex項(xiàng)目中是默認(rèn)打開的,比如在使用Accordion 和 TabNavigator組件時,在不同區(qū)域切換時,Flex會自動記錄下各個狀態(tài),我們可以通過點(diǎn)擊瀏覽器的“前進(jìn)”和“后退”按鈕來前進(jìn)和倒退,在你切換這些組件的區(qū)域時,Flex會自動你在網(wǎng)頁鏈接的后面加寫參數(shù),以便記錄當(dāng)前頁面的狀態(tài)。?
默認(rèn)情況下HistoryManager的功能是打開的,你可以通過設(shè)置各個組件或Application的historyManagementEnabled屬性為false(默認(rèn)為TRUE)來關(guān)閉此功能。?
這些都沒什么好講的。關(guān)鍵是怎么在一些普通組建上使用HistoryManager功能,默認(rèn)的navigator container組建都是支持該功能的。要使一些普通組建也支持此功能,必須:?
1.實(shí)現(xiàn)mx.managers.IHistoryManagerClient接口。?
2.用HistoryManager'的register()方法為組建注冊。?
3.當(dāng)組件狀態(tài)改變時保存組件的狀態(tài)。?
4.通過實(shí)施IHistoryManagerClient的saveState() 和 loadState()方法來保存和讀取組件狀態(tài)。?
拿CheckBox為例:?
<?xml version="1.0"?>?
<mx:CheckBox?
xmlns:mx="http://www.adobe.com/2006/mxml"?
label="Check me"?
implements="mx.managers.IHistoryManagerClient" //關(guān)鍵步驟1,實(shí)現(xiàn)接口?
creationComplete="mx.managers.HistoryManager.register(this);"//關(guān)鍵步驟2,注冊組件?
change="boxChanged(event)"//關(guān)鍵步驟3,當(dāng)組件發(fā)生變化時保存狀態(tài)?
>?
<mx:Script><![CDATA[?
import mx.managers.HistoryManager;?
//實(shí)施IHistoryManagerClient的saveState()方法保存狀態(tài)?
public function saveState():Object {?
return {selected:selected};?
}?
//實(shí)施IHistoryManagerClient的loadState()方法讀取狀態(tài)?
public function loadState(state:Object):void {?
var newState:Boolean = state;?
if (newState != selected) {?
selected = newState;?
} else {?
if (newState) {?
;?
} else {?
selected = true;?
}?
}?
}?
// 保存狀態(tài)?
private function boxChanged(e:Event):void {?
HistoryManager.save();?
}??
]]></mx:Script>?
</mx:CheckBox>?
注意:如果你把實(shí)現(xiàn)HistoryManager功能的組件放到module中,再在主程序中調(diào)用,那么HistoryManager功能是沒用的。?
麻雀雖小,五臟俱全。上面例子就是如何讓任意組件實(shí)現(xiàn)HistoryManager的典型案例。點(diǎn)擊瀏覽器的“前進(jìn)”和“后退”來恢復(fù)上個或下個狀態(tài)。?
BrowserManager類要比HistoryManager類更復(fù)雜些。BrowserManager類好比就是Flex程序和瀏覽器之間的一個代理。當(dāng)瀏覽地址欄的地址發(fā)生變化時,瀏覽器通過BrowserManager類告知Flex程序。?
可以通過BrowserManager類的getInstance()方法來獲得其一個實(shí)施了IBrowserManager接口的實(shí)例。這樣就可以訪問其setTitle()和setFragment()方法和屬性了。下面我就來介紹一下BrowserManager類的一些屬性和方法。?
Flex Deep Link(深鏈接)-方法:?
1.init(fragment,title)?
該方法可以定義默認(rèn)的鏈接參數(shù)和網(wǎng)頁標(biāo)題。一般在初始化時用到。例如:?
browserManager.init("", "Test Deep Linking");定義了參數(shù)為空,標(biāo)題為Test Deep Linking的網(wǎng)頁。?
2.setTitle(title)?
該方法用來設(shè)置網(wǎng)頁標(biāo)題。例如:?
browserManager.setTitle("The New Title") 設(shè)置網(wǎng)頁標(biāo)題為“The New Title”。?
3.setFragment(fragment)?
該方法用來設(shè)置網(wǎng)頁參數(shù)。例如:?
browserManager.setFragment("id=3") 設(shè)置參數(shù)“id=3”。?
Flex Deep Link(深鏈接)-屬性:?
1.url?
browserManager.url獲得頁面完整鏈接。?
2.base?
browserManager.base獲得頁面基地址。?
3.fragment?
browserManager.fragment獲得頁面鏈接#后的參數(shù)。?
4.lastURL?
browserManager.lastURL獲得上一個頁面鏈接——IE6我獲得是失敗的,火狐正確。大家可以自己試試。?
注意:上面的browserManager便是BrowserManager類的一個實(shí)例。實(shí)例化過程如下:?
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");?
}?
Flex Deep Link(深鏈接)-? 如何分析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)?
反過來設(shè)置地址欄鏈接:?
o.a=5;o.b=7;?
var s:String = URLUtil.objectToString(o,"&");?
browserManager.setFragment(s);?
注意:如果 URLUtil.objectToString()方法第二個參數(shù)為空,那么默認(rèn)的參數(shù)分隔符為";"號。?
BrowserManager類的事件?
BrowserManager類有三種事件:?
1.applicationURLChange事件;?
當(dāng)在程序執(zhí)行時調(diào)用setFragment()等方法改變URL時派發(fā)此事件。?
2.browserURLChange事件;?
當(dāng)手動改變?yōu)g覽器鏈接或點(diǎn)擊“前進(jìn)”或“后退”時派發(fā)此事件。?
3.urlChange事件;?
applicationURLChange事件或browserURLChange事件派發(fā)時,都將觸發(fā)該事件。?
Flex Deep Link(深鏈接)-? 獲得鏈接信息?
可以通過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);?
具體含義也很清楚,我也就不多講了。?
關(guān)于BrowserManager類大致也就上面的內(nèi)容。要注意的是BrowserManager類和HistoryManager類不能同時使用,也就是說用了BrowserManager類就不能再用HistoryManager類了,當(dāng)你用了BrowserManager類后,系統(tǒng)會自動禁用 HistoryManager類。?
既然能獲得了參數(shù),那么實(shí)現(xiàn)文章開頭那些功能也就沒什么了。通過在初始化程序中獲取相應(yīng)的參數(shù),再根據(jù)這些參數(shù)控制程序顯示。和.net,asp,php 類似,萬物皆規(guī)律。有了BrowserManager類的幫助,加上一些程序控制,現(xiàn)在我在瀏覽器輸入http://127.0.0.1 /news.html#id=20便能在Flash整站中顯示某個新聞頁面了。
轉(zhuǎn)載于:https://www.cnblogs.com/fldoing/p/3877210.html
總結(jié)
以上是生活随笔為你收集整理的Flex Accordion 和 TabNavigator组件浏览器跳转问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 临时文档2
- 下一篇: Android常用权限