将AS2 SWF加载到AS3 SWF并在URL中传递变量

时间:2009-01-26 21:25:47

标签: actionscript-3 url actionscript-2 params

我有一个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,它可以正常工作。

5 个答案:

答案 0 :(得分:4)

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

编辑:如果你无法更改加载的as2内容,你唯一的选择就是创建一个'wrapper'as2 loader,它使用上面的链接示例与as3进行通信,并使用_root.varname与加载的as2内容进行交互这不是很漂亮但它可能会起作用。

答案 1 :(得分:0)

在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
}

让我知道这是怎么回事。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

使用_root._url而不是查找_root.param,然后手动解析参数。

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太棒了,太过分了。

答案 4 :(得分:-1)

你做错了。

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

在名为 domain 的服务器上请求名为 as2.swf 的文件。当请求完成时,属于该http请求的任何?param = foo 参数都将丢失。如果服务器需要根据这些变量执行某些操作,那么它会,但是你要求 .swf 文件来检测这些变量,这只是愚蠢的。

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

我并不精通as2,但是在as3中,可以在包级别使用 this 关键字访问Global对象(对于as2来说可能是相同的,只是不用担心设置它在包装层面。)