访问动态加载的movieclip(舞台> scrollpane> myloader> movieclip)

时间:2011-10-16 22:39:14

标签: flash actionscript-3 actionscript loader movieclip

我正在尝试做的是访问

   snapText = scrollPane.source.textSnapshot;

来自外部瑞士法郎。我试过了:

  trace("-->: "+scrollPane.source.textSnapshot.getText(0, 1000));
  trace("-->: "+myLoader.content.textSnapshot.getText(0, 1000));
  trace("-->: "+mc.textSnapshot.getText(0, 1000));
  trace("-->: "+mc.getChildAt(0).textSnapshot.getText(0, 1000));
  trace("-->: "+mc.getChildByName(myLoader).textSnapshot.getText(0, 1000) );
  trace("-->: "+scrollPane.content.textSnapshot.getText(0, 100));
所有这些都没有结果。顺便说一句:

  mc.getChildAt(0).textSnapshot.getText(0, 1000)

抛出错误:

  1119: Access of possibly undefined property textSnapshot through a reference with static type flash.display:DisplayObject.

虽然我知道方法就在那里。

以上所有代码都在函数checkHandler中运行:

 myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, checkHandler);

所以swf应该已经完全加载了。 文本也在那里,我用swf反编译器检查过。 带有加载器的movieclip就像这样创建

 scrollPane = MovieClip(root).scrollPaneOnStage;
 myLoader.load(new URLRequest("tmp1.swf"));
 mc.addChild(myLoader);
 scrollPane.source = mc;

提前感谢!

更新 - 仍未解决

我正在按照HotN的指示访问swf。

  function checkHandler(evt:Event):void {

         libMC  = evt.target.content as MovieClip;
         libMC.gotoAndStop(0); 
          trace(libMC.textSnapshot.getText(0, 100));
         snapText = libMC.textSnapshot;
        scrollPane.source = mc;
    }

这首先导致错误,因为as3脚本中的加载器无法加载as2电影(即AVM1)。所以我创建了一个 AVM2 swf,导致错误:错误#2000:没有活动的安全上下文。作为一个解决方案,我使用了来自http://www.igorcosta.org/?p=231的类来加载swf,但仍 cant 访问textSnapshot:

  trace(libMC.textSnapshot.getText(0, 100));

不会返回任何内容并且不会抛出错误!

BTW:虽然我可以改变swf的格式,但我不能真正更改文件本身,因为它是自动生成的。

3 个答案:

答案 0 :(得分:1)

为了引用加载的swf中的任何内容,您需要查看用于加载swf的加载程序的内容。这将为您提供参考:

function checkHandler(e:Event):void {
    var loadedSWF:Object = e.target.content;
}

通过浏览loadedSWF,您可以获取swf的内容,假设它们已设置为公开可见性。

答案 1 :(得分:1)

您使用的是 TLF引擎(TLF文本字段)吗?加载SWF并尝试访问那些加载的SWF的属性或方法时,Flash CS5 TLF引擎会导致一些错误。您可以通过Steven Sacks在此博客文章中阅读所有相关内容。

如果是这样,解决方案非常简单:将TLF文本字段更改为常规文本字段(标记为经典文本,TextField属性面板上有一个选择器)并且(希望)一切都会正常工作,没有进一步的代码更改。

如果您需要TLF文本但不能使用常规文本,您可以在Adobe Technote中找到几种解决方案(更像是解决方法,但无论如何)。

希望这有帮助!

答案 2 :(得分:0)

所以这对我来说太长了,但我弄清楚了。

      //... {

        loader = new Loader();  
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, checkHandler);
        loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);
        var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain); 
        context.checkPolicyFile = false;
        loader.load(new URLRequest("tmp1.swf"), context);


      //..... }

      function checkHandler(evt:Event):void {

        loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,checkHandler);

        libMC  = loader.content as MovieClip;

                    //works now!
            libMC.textSnapshot.getText(100, 200);

        scrollPane.source = libMC;


    }

所以诀窍就是多次使用标准加载器功能。但闪存以某种方式弄乱了我本地电脑上的安全/沙盒设置,导致错误#2000:没有活动的安全上下文。但是当它上传到远程服务器时仍能正常工作,这很奇怪。您可以将文件>下的本地播放设置设置为“仅访问本地文件”。发布设置,但在我的情况下根本没有帮助...