如何重新组织下面的代码,以便trace命令为photourls数组中的每个元素输出i而不仅仅是最后一个元素?在6元素数组中,trace(i);
行输出5,5,5,5,5,5而不是0,1,2,3,4,5。
for (var i in photourls) {
loaders[i] = new Loader();
var img:URLRequest = new URLRequest(photourls[i]);
loaders[i].load(img);
addChild (loaders[i]);
loaders[i].contentLoaderInfo.addEventListener(Event.COMPLETE, function(e){
trace(i);
trace(loaders[i]);
});
}
非常感谢
答案 0 :(得分:2)
// list of photo urls
var photourls:Array = [/* ??? */];
// vars
var vars:Array = [];
var count:uint = 0;
// loop vars
var info:Object;
var ldr:Loader;
var img:URLRequest;
// load images in list
var i:String;
for each(i in photourls)
{
ldr = new Loader();
img = new URLRequest(i);
/**
* DEFINE YOUR VARS IN THIS OBJECT
* -------------------------------
*/
info =
{
target: ldr.contentLoaderInfo,
url: i,
counter: ++count,
other: img
};
vars[vars.length] = info;
ldr.load(img);
addChild(ldr);
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, _complete);
}
// complete event
function _complete(e:Event):void
{
var t:LoaderInfo = LoaderInfo(e.target);
// find storage object
var object:Object;
for each(object in vars)
{
if(object.target == t) break;
}
// example trace of info
trace(object.url);
trace(object.counter);
t.removeEventListener(Event.COMPLETE, _complete);
}
上面是一个非常混乱的例子,我创建了你自己的加载器类,它有你想要跟踪的变量,并在你创建加载器时设置这些变量。我会做一个例子。
您的 MyLoader 类:
package
{
import flash.display.Loader;
import flash.events.Event;
import flash.net.URLRequest;
public class MyLoader extends Loader
{
// vars
private var _url:String;
public var id:uint;
/**
* Loads an object
* @param url The URL to the object to load
*/
public function myLoad(url:String):void
{
var req:URLRequest = new URLRequest(url);
load(req);
contentLoaderInfo.addEventListener(Event.COMPLETE, _complete);
_url = url;
}
/**
* Load complete
*/
private function _complete(e:Event):void
{
contentLoaderInfo.removeEventListener(Event.COMPLETE, _complete);
trace(id, url);
}
/**
* Getters
*/
public function get url():String{ return _url; }
}
}
然后循环浏览列表并创建以下内容:
var photourls:Array = [/* ??? */];
var ldr:MyLoader;
var id:uint = 0;
var i:String;
for each(i in photourls)
{
ldr = new MyLoader();
ldr.id = ++id;
ldr.myLoad(i);
addChild(ldr);
}
答案 1 :(得分:2)
问题在于此代码:
loaders[i].contentLoaderInfo.addEventListener(Event.COMPLETE, function(e){
trace(i);
trace(loaders[i]);
});
因为“i”将在周围循环的整个过程中继续改变,所以这里仅使用“i”的最终值。我建议这个改变:
// place this outside of the loop.
function independantTrace( ...args:Array ):Function
{
return function( ...a:* ):void{trace( args.join( "\n" ) );}
}
loaders[i].contentLoaderInfo.addEventListener(Event.COMPLETE,
independantTrace(i,loaders[i]));
这将在循环中将该函数绑定到i和loaders [i]的值而不是“i”变量。