2016-06-24 48 views
6

我已經試過SWFLoader,但問題是加載的內容是MovieClip,我不知道如何與它交互,並且MovieClip#numChildren爲零。如何加載swf並與之交互?

順便說一下,我無法將flashvars傳遞給swf。

+0

該屬性爲'numChildren',並且可能正在加載的SWF被寫入,以便將其內容直接添加到'stage'。 – Vesper

+0

@Vesper然後我怎麼能與它交互? MovieClip#階段返回null。 –

+0

當您等待SWFLoader/Flex相關答案時...如果您使用AS3代碼(在''內)使用'Loader' API等加載您的SWF,會發生什麼? –

回答

3

首先,你應該知道你的問題沒有確切的答案,因爲它取決於你加載的SWF(你知道與否,它的顯示列表,......),但我會舉一個簡單的例子來解釋事情,你必須適應你的情況。

對於這個例子,假設我們有一個包含TextField(稱爲txt_url)和一個按鈕(稱爲btn_go)的按鈕(MovieClip)的非常簡單的SWF(加載的SWF)。

btn_go按鈕將打開在txt_url TextField中輸入的URL。

對於我們的第二SWF(裝載機)中,我們將使用一個Loader對象加載我們的第一個(在這種情況下將是Loader.content),然後我們將設置URL(該txt_url文本),並觸發單擊btn_go按鈕上的單擊事件。

因此,這裏是我們的loader.swf的代碼示例:

var loader:Loader = new Loader(); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, on_SWFLoad); 
    loader.load(new URLRequest('loaded.swf')); 
    addChild(loader); 

function on_SWFLoad(e:Event): void 
{ 
    // get our loaded SWF 
    var loaded_swf:DisplayObjectContainer = DisplayObjectContainer(loader.content); 

    // because we know our target objects, we can use "getChildByName()" 
    // set the URL 
    TextField(loaded_swf.getChildByName('txt_url')).text = 'http://www.example.com'; 

    // open the URL in the browser by triggering the click event on the "btn_go" button 
    MovieClip(loaded_swf.getChildByName('btn_go')).dispatchEvent(new MouseEvent(MouseEvent.CLICK));  
} 

這個例子將直接設置並加載SWF後,打開瀏覽器的URL,當然我們可以單擊後執行該行動按鈕或其他東西,但它只是一個簡單的例子,告訴你如何可以做...

現在,問題是,當我們不知道任何有關加載的SWF及其子(名稱,深度,.. ),在這種情況下,我們應該做更多的努力來做我們想做的事情:我們應該遍歷加載的SWF的整個顯示列表以識別目標對象。

回到我們的例子,讓我們說,我們只知道有一個文本字段,並在舞臺上的按鈕,這樣我們的代碼可以是這樣的,例如:

function on_SWFLoad(e:Event): void 
{ 
    var loaded_swf:DisplayObjectContainer = DisplayObjectContainer(loader.content); 
    var num_children:int = loaded_swf.numChildren; 

    for(var i:int = 0; i < num_children; i++) 
    { 
     var child:DisplayObject = loaded_swf.getChildAt(i); 

     if(child is TextField) 
     { 
      trace(child.name);   // gives : txt_url 
      TextField(child).text = 'http://www.example.com'; 
     } 
     else 
     { 
      if(child.hasEventListener(MouseEvent.CLICK)) 
      { 
       trace(child.name);  // gives : btn_go 
       child.dispatchEvent(new MouseEvent(MouseEvent.CLICK)); 
      } 
     } 
    } 
} 

再次,這是一個非常簡單的例如只是爲了顯示我們如何繼續...

...

然後約SWF之間傳遞值(PARAMS),看看在my answer of this question,你必須爲一個小例子。

關於Display programming(顯示列表,顯示對象,顯示對象容器...)的更多信息,請參閱here

希望能有所幫助。