1

无论如何使用 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

}
4

2 回答 2

5

首先,由于该load方法是异步的,因此代码中的这三个调用将依次相互覆盖。唯一会导致COMPLETE事件被分派的调用将是最后一个调用。如果要异步加载文件,则需要为每个文件创建一个 URLLoader 实例。

其次,(还有更多关于您的问题)URLLoader类中没有允许您访问最初调用URLRequesta 的属性。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;
}
于 2011-09-23T20:15:36.993 回答
1

创建三个 URLLoader。在完整的函数中,您可以检查事件目标的身份,以确定您从哪个设备获取事件,这将告诉您加载了哪个文件。您也可以使用三个不同的处理程序,具体取决于您希望如何分解代码。

文档不清楚当您在同一个 URLLoader 上多次调用 load 时会发生什么,这(对我而言)意味着它不是明确定义的行为,您应该避免它。对于您的示例,文档未指定您的事件处理程序是否将被调用一次或三次,如果多次调用,数据是否每次都不同。

于 2011-09-23T20:13:41.497 回答