使用URLLoader是否可以获得已加载文件的文件名?
public function loadCSS():void {
var urlLoader:URLLoader = new URLLoader();
urlLoader.addEventListener(Event.COMPLETE, urlLoader_complete);
urlLoader.load(new URLRequest("cssFile1"));
urlLoader.load(new URLRequest("cssFile2"));
urlLoader.load(new URLRequest("cssFile3"));
}
private function urlLoader_complete(evt:Event):void {
// *****How can I get the file name here?
var css:String = URLLoader(evt.currentTarget).data;
// Do lots of stuff
}
首先,由于load
方法是异步的,因此代码中的这三个调用将依次覆盖彼此。唯一会导致COMPLETE
事件被分派的调用将是最后一个。如果你想异步加载文件,你需要为每个文件创建一个URLLoader的实例。
第二,(和更多的你的问题)在URLLoader类中没有属性允许你访问URLRequest
, load()
最初被调用。
URLLoader
。例如,如果您只需要url:
public class MyURLLoader extends URLLoader
{
private var _url:String;
public function MyURLLoader(request:URLRequest=null)
{
super(request);
}
override public function load(request:URLRequest):void
{
super.load(request);
_url = request.url;
}
public function get url():String
{
return _url;
}
}
那么在你的代码中你仍然可以使用单个事件处理程序:
public function loadAllCSS():void {
loadCSSFile("cssFile1");
loadCSSFile("cssFile2");
loadCSSFile("cssFile3");
}
private function loadCSSFile(cssURL:String):void {
var urlLoader:MyURLLoader = new MyURLLoader();
urlLoader.addEventListener(Event.COMPLETE, urlLoader_complete);
urlLoader.load(new URLRequest(cssURL));
}
private function urlLoader_complete(evt:Event):void {
var cssURL:String = evt.target.url; //now I know where this came from
var css:String = evt.data;
}
创建三个urlloader。在完整的函数中,您可以检查事件目标的标识,以确定从哪个节点获取事件,这将告诉您加载了哪个文件。您也可以使用三个不同的处理程序,这取决于您希望如何分解代码。
文档不清楚当你在同一个URLLoader上多次调用load时会发生什么,这(对我来说)意味着它不是定义良好的行为,你应该避免它。对于您的示例,文档没有指定事件处理程序是调用一次还是调用三次,如果调用多次,则每次数据是否不同。