Flex有兩個可以管理「瀏覽器歷程的」的原生類,一個是BrowserManager一個是HistoryManager,搜尋過網路上資訊得知,現在大多以BowserManager為主HistoryManager已經少用,但是為什麼、是否需視不同狀況而用,目前本編不下結果,原因是還未做過HistoryManager的測試,待測試過後再來做個比較文章,因此本編著重於BrowserManager與IBrowserManager的應用測試。
/****
* 注意:測試時發現,使用SDK3.5運作不正常,用SDK 4,深層管理運作正常,問題還未查明。
* 參考文件 Adobe官方文件:
* http://help.adobe.com/zh_CN/AS3LCR/Flex_4.0/mx/managers/IBrowserManager.html
* http://help.adobe.com/zh_CN/AS3LCR/Flex_4.0/mx/managers/BrowserManager.html
*
* 主要用法:BrowserManager類只用來拿到實體,
*主要操作是藉由IBrowserManager介面來實現操作。
* */
//測試程式
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
historyManagementEnabled="false"
creationComplete="startProcess()"
>
<!--
BrowserManagerManager與historyManager同時間只能用一個,
因此使用BrowserManager做深層管理時要將historyManagementEnabled設為flase
-->
<mx:Script>
<![CDATA[
import mx.events.BrowserChangeEvent;
import mx.managers.BrowserManager;
import mx.managers.IBrowserManager;
import mx.utils.ObjectUtil;
import mx.utils.URLUtil;
private var _IbrowserManager:IBrowserManager;
private function startProcess():void
{
/*Step1.
取得BrowserManager實體,BowserManager是一個獨體模式,
因此使用getInstance取回運行環境中唯一的實體物件。
*/
_IbrowserManager = BrowserManager.getInstance();
//Step2. 初始化BrowserManager
_IbrowserManager.init();
//將Browser的各項屬性,呈現於From表單結構上
updateValue();
//對BrowserManager加上真聽式
addListener();
}
private function updateValue():void
{
/*當前URL 顯示在瀏覽器地址欄中時,“#”之前的部分。*/
_base.text = _IbrowserManager.base;
/*當前URL 顯示在瀏覽器地址欄中時,“#”之後的部分*/
_fragment.text = _IbrowserManager.fragment;
/*當前顯示在瀏覽器地址欄中的URL。*/
_URL.text = _IbrowserManager.url;
/*瀏覽器的標題*/
_title.text = _IbrowserManager.title;
}
private function changeTitleHandel(e:MouseEvent):void
{
if( _newTitle.text != null && _IbrowserManager.title != _newTitle.text )
{
_IbrowserManager.setTitle(_newTitle.text);
}
}
private function changeFragment(e:MouseEvent):void
{
if(_FragmentFirst.text != "" && _FragmentLast.text != "")
{
/*會將其加入歷程紀錄,並會改變瀏覽器上的URL*/
_IbrowserManager.setFragment(_FragmentFirst.text + "=" + _FragmentLast.text );
}
}
private function onBrowserChange(e:BrowserChangeEvent):void
{
//直接由瀏覽器URL列輸入改變時觸動
updateValue();
}
private function onUrlChange(e:BrowserChangeEvent):void
{
//不管是誰改變,只要URL有改變就會觸發
}
private function onAchange(e:BrowserChangeEvent):void
{
//使用程序setFragment()改變URL時會觸發該事件。
updateValue();
}
private function addListener():void
{
_changeTitleBtn.addEventListener(MouseEvent.MOUSE_DOWN , changeTitleHandel);
_changeFragment.addEventListener(MouseEvent.MOUSE_DOWN , changeFragment);
_IbrowserManager.addEventListener(BrowserChangeEvent.BROWSER_URL_CHANGE , onBrowserChange);
_IbrowserManager.addEventListener(BrowserChangeEvent.URL_CHANGE , onUrlChange);
_IbrowserManager.addEventListener(BrowserChangeEvent.APPLICATION_URL_CHANGE , onAchange);
}
]]>
</mx:Script>
<!--Form 的 fontSize具有繼承特性,From其子顯是元件都會被影響-->
<mx:Panel title="BrowserManager 測試" height="300">
<mx:Form width="100%" height="100%" fontSize="12">
<mx:FormHeading label="BrowserManager屬性"/>
<mx:FormItem label="base:">
<mx:Label id="_base" width="720"/>
</mx:FormItem>
<mx:FormItem label="fragment:">
<mx:Label id="_fragment" width="720"/>
</mx:FormItem>
<mx:FormItem label="url:">
<mx:Label id="_URL" width="700"/>
</mx:FormItem>
<mx:FormItem label="title:">
<mx:Label id="_title" width="700"/>
</mx:FormItem>
<mx:FormItem label="更改瀏覽器Title" direction="horizontal">
<mx:TextInput id="_newTitle" width="300"/>
<mx:Button label="送出更改" id="_changeTitleBtn"/>
<mx:Label text="這個更改不會影響瀏覽器的歷史紀錄" fontSize="12"/>
</mx:FormItem>
<mx:FormItem label="更改#後面的URL片段" direction="horizontal">
<mx:TextInput id="_FragmentFirst" width="100"/>
<mx:Label text="="/>
<mx:TextInput id="_FragmentLast" width="100"/>
<mx:Button id="_changeFragment" label="確定送出"/>
<mx:Label text="格式需要為 xxx=xxx"/>
</mx:FormItem>
</mx:Form>
</mx:Panel>
</mx:Application>
//
不過如果直接由瀏覽器來變更參數,反而不知如何加入歷程管理,但是能夠偵測到直接由瀏覽器輸入的變更,因為如果再變更的的henadel函式中如果直接使用setFragment()是不可行的,因為會一直造成BrowserChangeEvent.BROWSER_URL_CHANGE事件重複觸發。
沒有留言:
張貼留言