2011年1月5日 星期三

FlexDeep Link,Flex BrowserManager與IBrowserManager 測試

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事件重複觸發。

沒有留言:

張貼留言