Показать сообщение отдельно
Старый 26.04.2008, 14:21
ALiEN_ вне форума Посмотреть профиль Отправить личное сообщение для ALiEN_ Посетить домашнюю страницу ALiEN_ Найти все сообщения от ALiEN_
  № 6  
Ответить с цитированием
ALiEN_
UFO
 
Аватар для ALiEN_

Регистрация: Jul 2007
Сообщений: 173
Надо чтобы гуру форума заценили для начала ) Класс ведь реально весьма полезный и многим пригодится.
На всякий случай добавлю сюда код, т.к. в жж он побился.

Вот некоторые возможности:

- прозрачная генерация и получение событий ( JS <-> AS, AS <-> AS, JS <-> JS );
- возможность использовать флешку чисто, как обсервер для JS;
- возможность рассылать события бродкастом, т.е. нам все равно где находится подписчик какая у него глубина вложенности и т.д.;
- не имеет значения, где находится подписчик во флеш или в JS и не важно кто сгенерит событие.
- есть событие __all__, при подписке к которому подписчик будет слышать вообще все евенты.

Код:
package 
{

	
	import flash.external.*;
	
	
	
	public class EManager extends Object
	{
		
		
		private var externalHandlers = [];
		
		static private var _inst:EManager;
		
		
		
		static public function get inst ()
		{
			
			if ( !_inst ) _inst = new EManager ();
			
			return _inst;
			
		}
		
		
		
		public function EEventDispatcher ():void
		{
			
			ExternalInterface.addCallback ( "subscribe", subscribe );
			
			ExternalInterface.addCallback ( "unsubscribe", unsubscribe );
			
			ExternalInterface.addCallback ( "notify", notify );
			
		}
		
		
		
		public function subscribe ( event:String, handler ):void
		{
			
			if ( !( event in externalHandlers ) ) externalHandlers [ event ] = [];
			
			externalHandlers [ event ].push ( handler );
			
		}
		
		
		
		public function unsubscribe ( event:String, handler ):void
		{
			
			var handlers:Array = externalHandlers [ event ];
			
			if ( handlers ) 
				for ( var i:uint = 0, len = handlers.length; i < len; i++ )
					if ( handlers [ i ] == handler )
					{	
					
						handlers.splice ( i, 1 );
						
						break;
						
					}
			
		}
			

		
		public function notify ( event:String, params:Object = null ):void
		{
			
			var handlers:Array = ( ( externalHandlers [ event ] || [] ) as Array ).concat ( ( externalHandlers [ '__all__' ] || [] ) as Array );
						
						
			for ( var i:uint = 0, len = handlers.length; i < len; i++ ) 
			{

				if ( handlers [ i ] instanceof Function ) 
					handlers [ i ] ( params );
				else 
					ExternalInterface.call ( handlers [ i ], params );
								
			}
			   
		}
		
				
	}
	
}
Пример использования:
Например подпишемся на евент прямо во флеше, и получим его:
Код:
EManager.inst.subscribe ( "myEvent", myFunc );

EManager.inst.notify ( "myEvent", { param1:"a", param2:"b" } );

function myFunc ( e )
{
	
	trace ( e.param1 + " " + e.param2 );
	
} // a b
подписка от JS происходит точно так же =)


Последний раз редактировалось ALiEN_; 26.04.2008 в 14:31.