AS3:向加载的swf添加事件监听器

时间:2009-10-04 07:58:58

标签: actionscript-3 events

我正在尝试从我加载的SWF中侦听自定义事件,而我却无法捕获它。现在加载代码只是:

public function loadGame(gameSrc:String,gX:Number,gY:Number):void {
    var loader = new Loader();
    var addedDefinitions:LoaderContext = new LoaderContext();
    addedDefinitions.applicationDomain = new ApplicationDomain();   
    loader.load(new URLRequest(gameSrc));
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaded);

function onLoaded(evt:Event):void {   
    var game:MovieClip = MovieClip(evt.target.content);

    game.x = gX;
    game.y = gY;    

    chamber.mc_gameHolder.addChild(game);    
    Tweener.addTween(chamber.mc_gameTitle,{alpha:1,time:.75});  

    game.addEventListener("showQuiz",showQuiz);  
}

}

我知道事件是从我加载的SWF中被触发的,因为我还有一个监听器,当它被触发时会跟踪出一个“你好”。

任何?并且如果之前已经发布过道歉 - 搜索没有发现具体的内容。

7 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。这是你需要做的。在实例化LoaderContext时,请确保LoaderContext正在使用SecurityDomain.currentDomain。这将解决您的问题。

答案 1 :(得分:1)

这只适用于两个SWF都是AVM2Movie(使用AS3制作)的情况,我认为这是一种情况,因为否则转换为MovieClip会在运行时抛出错误。

您确定该事件是由加载的swf的文档类调度的,而不是由其中一个孩子调度的吗?因为您在addEventListener上调用game,这是加载的SWF的文档类(根),并且它不会捕获由其子项分派的事件。你能展示发送活动的代码吗?

答案 2 :(得分:0)

有可能在Event.COMPLETE事件之前调度事件。尝试为Event.INIT事件添加侦听器。当Loader首次访问加载的swf的文档对象时,将调度Event.INIT事件。

答案 3 :(得分:0)

嗯,不应该是:

addedDefintions.applicationDomain = ApplicationDomain.currentDomain允许加载的视频“访问”父视频吗?

同样出于测试目的,我建议冒泡事件,以使您没有错过任何显示对象。

答案 4 :(得分:0)

需要考虑的事项:

  • 加载的剪辑应来自启用安全性的域。如果加载闪存所在的域不同,则应将其包含在crossdomain.xml文件中。也加载了。
  • 通过Security.allowDomain手动将“allowDomain”设置为加载剪辑的域永远不会错。
  • 事件应该冒泡,因为Flash可能会在“游戏”var和实际内容之间添加一个或两个容器。
  • 加载和加载的剪辑必须是AS3。
  • 目标剪辑可能正在尝试从其自己的正确位置加载内容,因此当您在不同的URL下加载它时,它无法找到文件并失败,从未到达事件触发阶段第一名。

答案 5 :(得分:0)

创建一个LoaderContext,将ApplicationDomain设置为currentDomain,然后使用load()调用传递它:

loader = new Loader();
loader.contentLoaderInfo.addEventListener( Event.COMPLETE, handleLoaded );
var loaderContext:LoaderContext = new LoaderContext(false, new ApplicationDomain( ApplicationDomain.currentDomain ) );
loader.load( new URLRequest("yoMama.swf"), loaderContext );

您可以通过加载swf跟踪来自加载的swf的var或函数调用来确认您没有跨域问题。如果您得到了预期的结果,那么crossdomain.xml不是您的问题。

答案 6 :(得分:0)

在你的情况下你必须考虑一些事情。

(1)如果您要从SAME域加载代码,则不需要应用域。

(2)如果您从不同的域加载代码,请首先检查[crossdomain.xml]策略文件...第二...如果您不想浪费时间修复此问题...使用PHP并卷曲文件到你的域...然后加载(Flash会认为它从同一个域加载它)。