【问题标题】:Load AS2 SWF Into AS3 SWF and pass vars in URL将 AS2 SWF 加载到 AS3 SWF 中并在 URL 中传递变量
【发布时间】:2010-10-03 15:28:36
【问题描述】:

我有一个 AS3 SWF,我将把其他 SWF 加载到其中。这些子 SWF 都采用 URL 上的单个参数。加载 AS2 孩子时,我似乎无法让它工作,它需要能够同时处理这两者。

所以我有

var request:URLRequest = new URLRequest();
var loader:URLLoader = new URLLoader();

request.url = "http://domain/as2.swf?param=foo";
loader.load(request);
// etc on to the eventListeners, addChild, etc

当 as2 SWF 被加载时,它看不到我传递给它的参数。它正在寻找 _root.param。我是在做错事还是在尝试不可能的事情?

编辑:我应该补充一点,我可以从 AS2 加载器加载带有这些 URL 参数的 SWF,它工作得很好。

【问题讨论】:

    标签: actionscript-3 url actionscript-2 params


    【解决方案1】:

    你做错了。

    http://domain/as2.swf?param=foo

    是对名为 as2.swf 的文件的请求,位于名为 domain 的服务器上。请求完成后,作为该 http 请求一部分的任何 ?param=foo 参数都会丢失。如果服务器需要根据这些变量做某事,它会,但是你要求一个 .swf 文件来检测这些变量,这很愚蠢。

    在 Flash 播放器的全局对象(全局命名空间)中放置一个变量,然后当 as2 .swf 加载到该 Flash 播放器中时,它将可以访问您在全局对象中设置的变量。

    我不精通as2,但是在as3中,可以在包级别使用this关键字访问全局对象(as2可能相同,只是不用担心设置它在包级别)。

    【讨论】:

    • 如果我没有完全弄错,所有参数都可以在 as2 的 _root 中使用。
    • 另外,据我所知:'this' 指的是当前对象,而不是全局对象。
    • 这是您在全局范围内时的当前对象。
    • as2 和 as3 SWF 都可以像这样在 URL 中接收传递给它们的变量。在 AS2 中使用 _root.varName 完成,在 AS3 中使用 LoaderInfo。
    【解决方案2】:

    在 AS2 和 AS3 之间进行通信并非易事,因为它们在不同的虚拟机中运行。检查此http://www.gskinner.com/blog/archives/2007/07/swfbridge_easie.html 以获取一些提示。

    编辑:如果您无法更改加载的 as2 内容,您唯一的选择是创建一个“包装器”as2 加载器,该加载器使用上面的链接示例与 as3 通信,并使用 _root.varname 与加载的 as2 内容进行接口这并不漂亮但它可能会起作用。

    【讨论】:

    • 很遗憾,这不是一个选项,因为我通常无法控制正在加载的 SWF(横幅广告)的创作。
    • 嗯,我想在那种情况下你不走运——我能想到的最好的方法是创建一个额外的“包装器”as2 加载器,它使用上面链接的示例与 as3 通信并与使用 _root.varname 加载的 as2 内容
    【解决方案3】:

    可能值得尝试在 SWF 加载之后但在将其添加到舞台之前动态分配变量。即。

    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, movieLoaded);
    
    function movieLoadedHandler(event : Event) : void
    {
        var loaderInfo : LoaderInfo = event.target as LoaderInfo;
        var clip : DisplayObject = loaderInfo.content;
    
        for each(var prop in varsToTransfer)
        {
            clip[prop] = varsToTransfer[prop];
        }
    
        // add to parent
    }
    

    让我知道这是怎么回事。

    【讨论】:

    • 试过了,不幸的是它要么是“prop不存在”错误,要么什么都不会发生。我最终制作了一个包装 SWF。
    【解决方案4】:

    AS3 -> AS3

    电影 1(www.domain1.com): 单击“购买”按钮时加载外部电影...

    buy.addEventListener(MouseEvent.CLICK,function(){                   
        var ldr:Loader = new Loader();
        var url:String = "http://www.domain2.com/movie.swf?a=b&c=d";
        var urlReq:URLRequest = new URLRequest(url);
        ldr.load(urlReq);
        addChild(ldr);
        });
    

    电影 2(http://www.domain2.com/movie.swf):

    var mc:MovieClip = this as MovieClip;
    var ldi:LoaderInfo = mc.loaderInfo;
    var lobj:Object = ldi.parameters as Object;
    
    for (var l in lobj) {
        dumper.htmlText += l+" => "+lobj[l]+"<br />";
    }
    

    “dumper”是位于 Movie2 中的动态文本框字段的名称。 输出应如下所示:

    a => b
    c => d
    

    【讨论】:

      【解决方案5】:

      不要寻找 _root.param,而是使用 _root._url 然后手动解析出你的参数。

      var url: String = _root._url;
      var param: String = 'param=';
      var paramStart: Number = url.lastIndexOf(param);
      var paramValue: String = url.substring(paramStart + param.length, url.length);
      trace(paramValue);
      

      SWFBridge 对于这样的事情来说太棒了而且矫枉过正。

      【讨论】:

      • 我忘了提到您这样做只是因为您将 as2 swf 加载到 as3 swf 中。当只处理 as2 时,你会像往常一样使用 _root.param。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多