1

我尝试制作一个将 amfphp 与 as3 动画连接的应用程序。我从 amfphp 收到一个数组,我按“if”语句中的某个变量排序。之后,我有 2 个数组,其中包含彼此的数组:

var Array1:Array = [["http://url.to.swf", "http://url.to.link"], ["",""]...];
var Array2:Array = [["http://url.to.swf", "http://url.to.link"], ... ];

之后,我运行一个读取该数组并将每个 swf 加载到舞台的函数:

ladujBajkiGorne(Array1);

function ladujBajkiGorne(polkaGorna:Array):void {
    for(var i=0; i<polkaGorna.length; i++) {
        Aktual = polkaGorna[i];
        var mLoader:Loader = new Loader();
        var mRequest:URLRequest = new URLRequest(String(Aktual[0]));
        mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, myfunction = function(e:Event):void { onLoadGorna( e, String(Aktual[1]) ); } );
        mLoader.load(mRequest);
    }
}

然后

function onLoadGorna(e, arg1):void {
   userSwf = e.currentTarget.content;
   userSwf.buttonMode = true;
   userSwf.addEventListener(MouseEvent.CLICK, function(e:MouseEvent) { afterClick(e, arg1 ); });
   booksMC.addChild(userSwf);

   var childName:String = booksMC.getChildAt(childs).name;
   booksMC.getChildByName(childName).x = posX;
   booksMC.getChildByName(childName).y = 0;

   posX += 218;
   childs++;
}

最后

function afterClick(e, arg3) {
   var url:URLRequest = new URLRequest(arg3);
   navigateToURL(url, "_self");
}

问题是所有已加载的 swf 在链接中都有相同的 url。它在 addEventListener 语句中的 ladujBajkiGorne 函数中没有改变。我尝试了很多选择来改变它,但没有任何效果。有机会帮助我吗?提前谢谢了

4

2 回答 2

2

问题在于加载程序完成处理程序的异步执行。将适当的参数传递给加载程序并在处理程序上读取它会非常好。我提出了一个简单的解决方案,更正您的代码:

function ladujBajkiGorne(polkaGorna:Array):void {
    for(var i=0; i<polkaGorna.length; i++) {
        Aktual = polkaGorna[i];
        var mLoader:Loader = new Loader();
        var mRequest:URLRequest = new URLRequest(Aktual[0]+"?link="+Aktual[1]);
        mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, myfunction = function(e:Event):void { onLoadGorna( e ); } );
        mLoader.load(mRequest);
    }
}

function onLoadGorna(e):void {
   var link:String = e.currentTarget.parameters.link;
   userSwf = e.currentTarget.content;
   userSwf.buttonMode = true;
   userSwf.addEventListener(MouseEvent.CLICK, function(e:MouseEvent) { afterClick(e, link ); });
   booksMC.addChild(userSwf);

   var childName:String = booksMC.getChildAt(childs).name;
   booksMC.getChildByName(childName).x = posX;
   booksMC.getChildByName(childName).y = 0;

   posX += 218;
   childs++;
}

之后,每个加载器都知道它的链接。

于 2013-01-16T19:54:11.587 回答
1

问题出在完整事件的事件处理程序中。调用一个函数,该函数返回一个新函数作为事件处理程序。

首先,创建一个这样的函数:

function getCompleteHandler(url:String):Function {
    return function (e:Event) {
        onLoadGorna(e, url);
    }
}

然后替换这个:

mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, myfunction = function(e:Event):void { onLoadGorna( e, String(Aktual[1]) ); } );

这样:

mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, getCompleteHandler(Aktual[1]) );

现在应该可以了!!

于 2013-01-16T14:44:12.907 回答