Этот недокументированный объект является ядром новой модели событий Flash MX.
Он используется во внутреннем механизме для управления подпиской на сообщения
о событиях встроенных объектов, отписки от сообщений о событиях встроенных объектов
и распространения сообщений о событиях встроенных объектов на все подписанные
объекты. Этот объект может также использоваться для ваших собственных нужд, и
здесь он становится действительно полезным..
Чтобы хорошо понимать все термины, использованные в этой статье, пожалуйста,
убедитесь, что вы прочитали статью "Новая
модель событий в Flash MX".
Объект ASBroadcaster имеет четыре метода:
ASBroadcaster.initialize //Статический метод[1]
ASBroadcaster.addListener //Метод передается по наследству
ASBroadcaster.removeListener //Передается по наследству
ASBroadcaster.broadcastMessage //Передается по наследству
ASBroadcaster представляет ту же функциональность, что и библиотека ActionScript
"FLEM", которую выпустил Branden Hall во времена Flash 5. Так что если
вы пользовались FLEM, у вас не будет проблем с использованием этого встроенного
движка событий.
Это статический метод, он может использоваться только в вышеуказанном контексте,
вызывается только непосредственно как метод самого объекта ASBroadcaster.
Этот метод используется, чтобы добавлять функциональность Слушателя[2]
для объекта, передаваемого объекту ASBroadcaster в качестве аргумента
obj. Когда вызывается этот метод, он добавляет три других метода
и одно скрытое свойство для передачи аргументу obj:
obj._listeners //скрытое свойство
obj.addListener //метод
obj.removeListener //метод
obj.broadcastMessage //метод
Этот метод добавляется ко всем объектам, которые передаются методу ASBroadcaster.initialize
в качестве аргумента. Он подписывает передаваемый в качестве аргумента объект
obj на уведомления о событиях, относящихся к объекту, из которого
вызван этот метод. Например:
Key.addListener(myobject);
Подписывает объект с именем myobject на получение сообщений о
событиях объекта Key.
При вызове этого метода аргумент, переданный как obj, добавляется
в массив _listeners. Этот метод возвращает true.
myobject={}; //создаем новый объект
subscribed=Key.addListener(myobject); //подписываем его на сообщения о событиях
объекта Key
trace(subscribed); //выводит "true"
Этот метод также добавляется к объекту, передаваемому методу ASBroadcaster.initialize
в качестве аргумента. Он отписывает передаваемый в качестве аргумента объект obj
от сообщений о событиях, относящихся к объекту, из которого вызван метод. Например:
Key.removeListener(myobject);
Отписывает объект с именем myobject от получения сообщений о событиях
объекта Key. При вызове этого метода массив _listeners
просматривается до тех пор, пока в нем не будет найден объект, переданный как
аргумент obj; после нахождения он удаляется из массива _listeners.
Этот метод возвращает true, если объект был успешно удален из
массива _listeners, иначе он возвращает false, например,
если имя объекта obj не было найдено в массиве _listeners.
myobject={}; //создаем новый объект
Key.addListener(myobject); //подписываем его на сообщения о событиях объекта Key
removed=Key.removeListener(myobject); //отписываем его от сообщений о событиях
объекта Key
trace(removed[3]);
//выводит "true"
removed=Key.removeListener(none_existent_object); //отписываем
его от сообщений событиях объекта Key несуществующий объект, или объект, который
не был на них подписан
trace(removed[4]);
//выводит 'false'
Этот метод также добавляется как аргумент ко всем объектам, которые передаются
методу ASBroadcaster.initialize в качестве аргумента. Он используется
для рассылки уведомления о событии всем объектам, подписанным на получение сообщений
от объекта, которому принадлежит метод. Все объекты, содержащиеся в массиве _listeners
объекта, которому принадлежит этот метод, оповещаются о происхождении события.
Этот метод запрашивает один аргумент — theEvent, это строка,
представляющая обработчик события, находящийся внутри всех подписанных объектов,
и если свойство с именем theEvent находится в каком-либо подписанном
объекте, вызывается ссылка на функцию, содержащуюся внутри этого свойства.
Например, когда происходит событие onMouseMove, объект Mouse
выполняет такую строку кода:
this.broadcastMessage("onMouseMove");
И все объекты, содержащиеся в массиве Mouse._listeners будут
оповещены о событии onMouseMove. Если какой-либо объект из массива
Mouse._listeners имеет свойство с именем onMouseMove,
метод broadcastMessage пытается вызвать содержимое этого свойства
как функцию, следовательно, свойство onMouseMove — это обработчик
событий, оно должно содержать ссылку на функцию.
Это скрытое свойство является массивом, содержащим ссылки на все объекты, подписанные
на получения сообщений о событиях объекта, которому принадлежит это свойство.
Чтобы лучше объяснить действие этого объекта, я приведу код, выполняющий те
же функции, что и объект ASBroadcaster:
ASBroadcaster={};
ASBroadcaster.initialize=function(obj){
obj.addListener=this.addListener;
obj.removeListener=this.removeListener;
obj.broadcastMessage=this.broadcastMessage;
obj._listeners=[];
}
ASBroadcaster.addListener=function(obj){
this.removeListener(obj);
this._listeners.push(obj);
return true;
}
ASBroadcaster.removeListener=function(obj){
var a=this._listeners;
var i=this._listeners.length;
while(--i){
if(a[i] == obj){
a.splice(i,1);
return
true;
}
}
return false;
}
ASBroadcaster.broadcastMessage=function(theEvent){
var a=this._listeners;
var i=this._listeners.length;
while(--i){
a[i][theEvent]();
}
}
Если вы можете читать и понимать AS, вы должны были понять, что происходит.
Настоящий внутренний ActionScript для этого объекта не сильно отличается:
function AsBroadcaster(){};
o=AsBroadcaster;
o.broadcastMessage=ASnative(101, 12);
o.addListener=function(x){
this.removeListener(x);
this._listeners.push(x);
return(true);
}
o.removeListener=function(x){
var a=this._listeners;
var i=0;
while(i if(a[i]==x){
a.splice(i,1);
return(true);
}
i++;
}
return(false);
}
o.initialize=function(o){
o.broadcastMessage=ASnative(101,12);
o.addListener=AsBroadcaster.addListener;
o.removeListener=AsBroadcaster.removeListener;
o._listeners=[];
ASSetPropFlag(o,'broadcastMessage, addListener,removeListener,_listeners',13,1);
}
ASSetPropFlags(o,null,3);
Чтобы привести пример полезности использования недокументированного объекта
ASBroadcaster, мы добавим уведомление о событии onEnterFrame
к объекту Movieclip, очень полезное событие, которое в настоящий
момент недоступно в Flash MX Actionscript, возможно, из соображений производительности,
также отметьте, что объект Movieclip не имеет методов addListener
и removeListener в Flash MX Actionscript:
//добавляем "broadcastMessage", "addListener",
"removeListener" и "_listeners" для объекта "Movieclip"
ASBroadcaster.initialize(Movieclip);
//создаем новый мувиклип на очень глубоком слое
this.createEmptyMovieClip("__enterframe",-99999);
//на каждом кадре распространяем сообщение о событии "onEnterFrame"
всем подписанным клипам
this.__enterFrame.onEnterFrame=function(){
Movieclip.broadcastMessage("onEnterFrame");
}
//создаем объект
myobject={};
//определяем обработчик события "onEnterFrame"
myobject.onEnterFrame=function(){
trace("произошел вызов обработчика события onEnterFrame для 'myobject'");
}
//подписываемся на сообщения о событиях "Movieclip"
Movieclip.addListener(myobject);
См. раздел ASBroadcaster
на Flashcoders
Wiki.
[новое окно]>