2016-06-24 22 views
6

Ich habe versucht SWFLoader, aber das Problem ist der geladene Inhalt ist MovieClip und ich weiß nicht, wie Sie damit umgehen, und der MovieClip # numChildren ist Null.Wie lade ich ein swf und interagiere damit?

Und übrigens, ich kann die flashvars nicht an die swf übergeben.

+0

Die Eigenschaft ist 'numChildren', und wahrscheinlich wird die SWF, die Sie laden, so geschrieben, dass sie ihren Inhalt direkt zu' stage' hinzufügt. – Vesper

+0

@Vesper dann wie könnte ich damit interagieren? MovieClip # stage gibt null zurück. –

+0

Während Sie auf eine SWFLoader/Flex-Antwort warten ... Was passiert, wenn Sie AS3-Code (innerhalb einer '') verwenden, um Ihre SWF mit 'Loader'-API usw. zu laden? –

Antwort

3

Zuerst sollten Sie wissen, dass es keine genaue Antwort auf Ihre Frage gibt, da es von Ihrer geladenen SWF abhängt (Sie wissen es oder nicht, seine Anzeigeliste, ...), aber ich werde ein einfaches Beispiel erklären Dinge und Sie müssen es an Ihren Fall anpassen.

In diesem Beispiel haben wir eine sehr einfache SWF (die geladene SWF), die ein TextField (genannt txt_url) und eine Schaltfläche (ein MovieClip, genannt btn_go) enthält.

Die Schaltfläche btn_go öffnet die URL, die im Textfeld txt_url eingegeben wurde.

Für unsere zweite SWF (der Loader), werden wir ein Loader Objekt verwenden unsere erste (die in diesem Fall ist, wird die Loader.content sein) zu laden und dann werden wir die URL (die txt_url Text) und Trigger setzen die Klicken Sie auf Ereignis auf die Schaltfläche btn_go.

So, hier ist ein Beispiel für den Code unserer 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));  
} 

Dieses Beispiel direkt eingestellt wird und öffnen Sie die URL im Browser nach dem SWF-Laden, natürlich können wir diese Aktion ausführen nach einem Klick Knopf oder etwas anderes, aber es ist nur ein einfaches Beispiel, um Ihnen zu zeigen, wie Sie ...

Nun, das Problem ist, wenn wir nichts über die geladenen SWF und seine Kinder wissen (Namen, Tiefen, .. .), in diesem Fall sollten wir uns mehr anstrengen, um das zu tun, was wir wollen: Wir sollten die gesamte Display-Liste der geladenen SWFs durchqueren, um sie zu identifizieren die Zielobjekte.

zu unserem Beispiel zurückkehrend und lassen Sie sich sagen, dass wir nur wissen, dass es ein TextField- und eine Taste in der Bühne ist, so dass unser Code wie folgt beispielsweise sein:

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)); 
      } 
     } 
    } 
} 

Wieder ist es ein sehr einfaches Beispiel zu zeigen, wie wir fortfahren können ...

...

Dann über die Weitergabe Werte (params) zwischen SWFs, werfen Sie einen Blick auf my answer of this question, wo Sie ein kleines Beispiel dafür.

Weitere Informationen über Display programming (Anzeigeliste, Anzeigeobjekt, Anzeigeobjektcontainer, ...) werfen Sie einen Blick auf here.

Hoffe, dass kann helfen.