Читая книгу, я наткнулся на этот пример:
Вот класс:
package com.learningactionscript3.loading {
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.events.Event;
import flash.events.HTTPStatusEvent;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.net.URLRequest;
public class CustomLoader extends Loader {
private var _ldrInfo:LoaderInfo;
private var _path:String;
private var _verbose:Boolean = false;
private var _loadedPercent:Number = 0;
//constructor
public function CustomLoader(path:String="",
verbose:Boolean=false) {
_path = path;
_verbose = verbose;
addListeners();
if (path != null) {
try {
this.load(new URLRequest(path));
} catch (err:Error) {
trace("Cannot load", _path, err.message);
}
}
}
//listeners
private function addListeners():void {
_ldrInfo = this.contentLoaderInfo;
_ldrInfo.addEventListener(Event.OPEN,
onOpen, false, 0, true);
_ldrInfo.addEventListener(ProgressEvent.PROGRESS,
onProgress, false, 0, true);
_ldrInfo.addEventListener(HTTPStatusEvent.HTTP_STATUS,
onStatusEvent,
false, 0, true);
_ldrInfo.addEventListener(Event.INIT,
onInit, false, 0, true);
_ldrInfo.addEventListener(Event.COMPLETE,
onComplete, false, 0, true);
_ldrInfo.addEventListener(IOErrorEvent.IO_ERROR,
onIOError, false, 0, true);
_ldrInfo.addEventListener(Event.UNLOAD,
onUnloadContent,
false, 0, true);
}
public function removeListeners():void {
_ldrInfo.removeEventListener(Event.OPEN, onOpen);
_ldrInfo.removeEventListener(ProgressEvent.PROGRESS,
onProgress);
_ldrInfo.removeEventListener(HTTPStatusEvent.HTTP_STATUS,
onStatusEvent);
_ldrInfo.removeEventListener(Event.INIT, onInit);
_ldrInfo.removeEventListener(Event.COMPLETE,
onComplete);
_ldrInfo.removeEventListener(IOErrorEvent.IO_ERROR,
onIOError);
_ldrInfo.removeEventListener(Event.UNLOAD,
onUnloadContent);
}
//listener methods, getter, and setter
private function onOpen(evt:Event):void {
if (_verbose) { trace("Loading begun:", _path); }
}
private function onProgress(evt:ProgressEvent):void {
_loadedPercent = evt.bytesLoaded/evt.bytesTotal;
if (_verbose) {
trace("Loading", _path,
"-- progress (0-1):", _loadedPercent);
}
}
private function onStatusEvent(evt:HTTPStatusEvent):void {
if (_verbose) { trace("HTTP status:", evt.status); }
}
private function onInit(evt:Event):void {
if (_verbose) {
trace("Content initialized. Properties:");
trace(" url:", evt.target.url)
trace(" Same Domain:", evt.target.sameDomain)
if (evt.target.contentType ==
"application/x-shockwave-flash") {
trace(" SWF Version:", evt.target.swfVersion)
trace(" AS Version:",
evt.target.actionScriptVersion)
trace(" Frame Rate:", evt.target.frameRate)
}
}
}
private function onComplete(evt:Event):void {
if (_verbose) { trace("Loading complete:", _path); }
}
private function onUnloadContent(evt:Event):void {
if (_verbose) { trace("Unloaded:", _path); }
}
private function onIOError(evt:IOErrorEvent):void {
trace("Loading error:\n", evt.text);
}
public function get percentLoaded():Number {
return _loadedPercent;
}
public function set verbose(bool:Boolean):void {
_verbose = bool;
}
}
}
проблема в этой строке:
_ldrInfo = this.contentLoaderInfo;
Несколько слушателей событий добавлено внутри этого свойства ... и теперь все в порядке.
Теперь в кадре FLA-файла (где создается этот класс) и добавляется новый eventListener, с тем же именем, что и для внутреннего создания:
var swfLoader: CustomLoader = new CustomLoader ("swfToLoad.swf", true);
AddChild (SWFLoader);
swfLoader.contentLoaderInfo.addEventListener (Event.COMPLETE,
OnComplete,
false, 0, true);
Из этого примера я могу сделать вывод, что swfLoader.contentLoaderInfo и _ldrInfo = this.contentLoaderInfo ссылаются на один и тот же объект в одной и той же ячейке памяти. Поэтому вы можете подумать: «хорошо, последнее добавленное событие перезапишет первое (внутренне добавленное). Но это не так. Два слушателя событий будут отвечать последовательно. Сначала внутренний слушатель, а затем внешний слушатель. Как это возможно?