2010-02-20 87 views
7

我有一个A.swf,它将B.swf加载到一个动画片段并需要传递一些FlashVars。当用html加载B.swf时,我可以很好的传递FlashVars。当从A.swf传递时,它会得到一个AS3将FlashVars传递到加载的swf

错误#2044:未处理ioError :.文本=错误#2032:流错误。网址:文件:

在A.swf中的代码是

var request:URLRequest = new URLRequest ("B.swf"); 

var variables : URLVariables = new URLVariables(); 
variables.xml = "test.xml"; 

// This line causes the error 2044, else B.swf loads fine with FlashVars 
request.data = variables; 

loader.load (request); 

B.swf中,它被检查Flash变量,像这样。它工作正常,从HTML侧

this.loaderInfo.parameters.xml 
+0

这是一个含糊不清的问题。有两部分: 1)如何让FlashVars进入B,我在下面回答。 2)如何从A中传递任何类型的变量到B中。 – 2011-12-07 16:27:43

回答

0

您可以添加Flash变量到URI当加载它

URLRequest(String("B.swf" + "?myvar=45")); 

的问题是,当你加载URI中的字符串,它被放在在对象loaderInfo.parameters中,所以如果你想传递这些参数,你需要创建一个字符串来传递这些参数。

这里是从http://ragona.com/blog/pass-flashvars-loaded-swf/一个脚本,显示如何一遍转换成字符串数组

//:: Store loader info 
var lInfo:Object = this.root.loaderInfo.parameters; 
//:: Flashvars 
var fVars:String = "?whee=nada"; //:: Getting the syntax change (? --> &) out of the way with a dummy var 

//:: Set path + data 
for (var flashVar in lInfo) 
{ 
    fVars += "&" + flashVar + "=" + lInfo[flashVar]; 
} 

var myRequest:URLRequest = new URLRequest(String("/myPath.swf" + fVars)); 
+0

谢谢,但我忘了提及,我也尝试过,它给出了同样的错误。 我看到一个页面提到,因为传递FlashVars无法与本地swf一起工作,是这个问题吗? – Robin 2010-02-20 18:40:37

+0

我认为没有理由不工作,但你可以尝试“沙盒”的文件夹的权限。 – Daniel 2010-02-21 10:47:36

0

如何沙箱的权限?我尝试通过设置添加文件夹,但那不起作用。

http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html#117502

我做了一个简单的新项目。这是完整的代码。

var mc:MovieClip = new MovieClip(); 

var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener (Event.COMPLETE, OnComplete); 

var request:URLRequest = new URLRequest ("B.swf"); 

var variables : URLVariables = new URLVariables(); 
variables.xml = "test2.xml"; 

// This line causes the error 2044, if i comment out, it runs fine without FlashVars 
request.data = variables; 

loader.load (request); 


function OnComplete (e:Event) 
{ 
    trace ("On Complete"); 
    mc = e.currentTarget.content as MovieClip; 
    addChild (mc); 
} 
+0

我发现有什么问题。如果我在普通flash播放器中运行swf,但它在我使用Ctrl + Enter从编辑器启动时的调试版本不起作用。但我无法再调试嗯.. – Robin 2010-02-22 10:57:28

+0

跟踪(Security.sandboxType),给我localTrusted。我添加了Security.allowInsecureDomain(“*”),但仍然没有去。 – Robin 2010-02-22 11:38:46

17

虽然查询字符串的方法应该做工精细本地,如果你正在使用Flash Player 10.2,有这个新的API。

var context:LoaderContext = new LoaderContext(); 
context.parameters = {'xml': 'test.xml'}; 
loader.load(request, context); 

的文档是在这里: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/LoaderContext.html#parameters

+1

我希望我可以投票十次...... – 2011-05-16 19:35:20

+0

似乎要从API中删除。 '参数'是undefined :( – roberkules 2011-07-05 11:30:55

+0

@roberkules你是否瞄准了正确版本的Flash? – 2011-07-05 19:27:27

2

这是没有必要的 “A” 通过Flash变数 “B”。只需让B访问FlashVars本身。以下内容适用于B是否位于A或顶层本身:

在B的构造函数中添加ADDED_TO_STAGE事件侦听器。例如:

function B(){ 
    this.addEventListener(Event.AddedToStage, onAddedToStageHandler); 
} 

当你访问阶段,你现在可以访问在Flash变量一个是这样的:

要正确地看到一个名为myVar Flash变数B.swf中的变量,你这样做(内B) :

private function onAddedToStageHandler(){ 
var flashVars : Object = LoaderInfo(this.stage.loaderInfo).parameters; 
// now you have access to your flashVars! 
trace(flashVars.myVar); 
} 

stage.loaderInfo是你需要看的。

+0

谢谢。在我看来最好的解决方案。 – 2011-11-30 23:44:04

+0

我也这么认为:) – 2011-12-07 14:42:32