【问题标题】:AS3: add event listener to loaded swfAS3:向加载的 swf 添加事件侦听器
【发布时间】:2009-10-04 07:58:57
【问题描述】:

我正在尝试从已加载的 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 中触发的,因为我那里还有一个侦听器,它在触发时会追踪“你好”。

有人吗?如果之前已发布过此内容,我们深表歉意 - 搜索没有找到任何具体内容。

【问题讨论】:

    标签: actionscript-3 events


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这只有在两个 SWF 都是 AVM2Movie(使用 AS3 制作)时才有效,我假设这里就是这种情况,因为否则转换为 MovieClip 会在运行时引发错误。

      您确定该事件是由加载的 swf 的文档类而不是它的一个子类调度的吗?因为您在game 上调用addEventListener,这是加载的SWF 的文档类(根),它不会捕获其子级调度的事件。你能在你调度事件的地方显示代码吗?

      【讨论】:

        【解决方案3】:

        事件可能在Event.COMPLETE 事件之前被调度。尝试为Event.INIT 事件添加一个监听器。 Event.INIT 事件在 Loader 首次访问已加载的 swf 的文档对象时调度。

        【讨论】:

          【解决方案4】:

          嗯,不应该吗:

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

          出于测试目的,我建议您冒泡事件,以确保您不会错过中间的显示对象。

          【讨论】:

            【解决方案5】:

            需要考虑的事项:

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

            【讨论】:

              【解决方案6】:

              创建一个将 ApplicationDomain 设置为 currentDomain 的 LoaderContext,然后将它与您的 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 不是你的问题。

              【讨论】:

              • new ApplicationDomain( ApplicationDomain.currentDomain ) == 新域 == 无法访问代码。具有讽刺意味的测试...在一个新项目中...检查(基础 swf 类的)应用程序域的加载器信息是否与当前应用程序域相同 == 不是!您必须使用 ApplicationDomain.currentDomain ,它仅在基类完全构建后才映射,而不是在构建期间。
              【解决方案7】:

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

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

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

              【讨论】:

                猜你喜欢
                • 2011-09-19
                • 2010-11-26
                • 1970-01-01
                • 1970-01-01
                • 2013-03-28
                • 1970-01-01
                • 2011-09-11
                • 1970-01-01
                • 2020-06-29
                相关资源
                最近更新 更多