代码之家  ›  专栏  ›  技术社区  ›  matt lohkamp

如何从UrlLoader激发的event.complete获取关联的UrlRequest

  •  3
  • matt lohkamp  · 技术社区  · 15 年前

    所以假设我们要加载一些XML-

    var xmlURL:String = 'content.xml';
    var xmlURLRequest:URLRequest = new URLRequest(xmlURL);
    var xmlURLLoader:URLLoader = new URLLoader(xmlURLRequest);
    xmlURLLoader.addEventListener(Event.COMPLETE, function(e:Event):void{
     trace('loaded',xmlURL);
     trace(XML(e.target.data));
    });
    

    如果我们需要知道特定XML文档的源URL,我们就需要知道这个变量,对吗?现在让我们假设xmlurl变量不在我们身边-也许我们希望加载3个按顺序命名的XML文档,并且我们希望在for循环中使用一次性变量:

    for(var i:uint = 3; i > 0; i--){
     var xmlURLLoader:URLLoader = new URLLoader(new URLRequest('content'+i+'.xml'));
     xmlURLLoader.addEventListener(Event.COMPLETE, function(e:Event):void{
      trace(e.target.src); // I wish this worked...
      trace(XML(e.target.data));
     });
    }
    

    突然之间就不那么容易了,对吧?

    我讨厌你不能只说e.target.src之类的话——有没有一个好的方法可以将urloaders与从中加载数据的url关联起来?我错过什么了吗?这对我来说是不可能的。

    2 回复  |  直到 15 年前
        1
  •  7
  •   Cory Petosky    15 年前
    for (var i:uint = 3; i > 0; i--) {
        var src:URLRequest = new URLRequest('content'+i+'.xml');
        var xmlURLLoader:URLLoader = new URLLoader(src);
        xmlURLLoader.addEventListener(Event.COMPLETE, function(req:URLRequest):Function {
            return function(e:Event):void {
                trace(req); // Should work
                // whatever you need to do
            }
        }(src));
    }
    

    您必须使用第二个函数包装请求,否则所有三个事件侦听器都将引用最后一个请求。

        2
  •  2
  •   ulfben    15 年前

    斯贝里2A在正确的轨道上。罗伯特·彭纳最近向我们展示了 URLLoader is nothing but a tiny wrapper 围绕着本地的曲面,所以滚动您自己的曲面是一个合理的想法。

    public class URLLoader extends EventDispatcher{     
        private var _urlRequest:URLRequest; //the built-in URLLoader doesn't give you any access to the requested URL...
        private var _stream:URLStream;
        private var _dataFormat:String;// = "text"
        private var _data:*;
        private var _bytesLoaded:uint;// = 0
        private var _bytesTotal:uint;// = 0
    
        public function get request():URLRequest { return _urlRequest;}     
        public function get fileName():String { return _urlRequest.url.match(/(?:\\|\/)([^\\\/]*)$/)[1];}       
        public function get dataFormat():String { return _dataFormat;}      
        public function get data():* { return _data; }      
        public function get bytesLoaded():uint { return _bytesLoaded; }     
        public function get bytesTotal():uint { return _bytesTotal; }       
    
        public function URLLoader(request:URLRequest = null){
            super();
            _stream = new URLStream();
            _stream.addEventListener(Event.OPEN, openHandler);
            _stream.addEventListener(ProgressEvent.PROGRESS, progressHandler);
            _stream.addEventListener(Event.COMPLETE, completeHandler);
            _stream.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
            _stream.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
            _stream.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
            if (request != null){
                load(request);
            };
        }
        public function load(request:URLRequest):void {
            _urlRequest = request;
            _stream.load(_urlRequest);
        }
        public function close():void{
            _stream.close();
        }
    
        private function progressHandler(event:ProgressEvent):void {
            _bytesLoaded = event.bytesLoaded;
            _bytesTotal = event.bytesTotal;
            dispatchEvent(event);
        }
        private function completeHandler(event:Event):void{
            var bytes:ByteArray = new ByteArray();
            _stream.readBytes(bytes);
            switch (_dataFormat){
                case "binary":
                    _data = bytes;
                    break;
                case "variables":
                    if (bytes.length > 0){
                        _data = new URLVariables(bytes.toString());
                        break;
                    };
                case "text":
                default:
                    _data = bytes.toString();
                    break;
            };
            trace("URLLoader: (" + fileName + "): " + event.type);
            dispatchEvent(event);
        }
        private function openHandler(event:Event):void {
            trace("URLLoader: ("+fileName+"): " + event.type +" "+_urlRequest.url);
             dispatchEvent(event);
        }
        private function securityErrorHandler(event:SecurityErrorEvent):void {
            trace("URLLoader ("+fileName+"): " + event.type + " - " + event.text);
            dispatchEvent(event);
        }
        private function httpStatusHandler(event:HTTPStatusEvent):void {          
            dispatchEvent(event);
        }   
        private function ioErrorHandler(event:IOErrorEvent):void {
             trace("URLLoader ("+fileName+"): " + event.type + " - " + event.text);
            dispatchEvent(event);
        }       
    }
    

    注意请求和文件名属性。要从完整的事件处理程序获取urlrequest,只需执行以下操作: var req:URLRequest = URLLoader(evtObj.target).request;