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

Регистрация: Jul 2007
Сообщений: 173
Вобщем вот набросок, рабочий. Если кому надо, юзайте.

Код:
package 
{
	
	import flash.display.Sprite;
	import flash.events.*;
	import flash.external.*;
	
	public class JSListener extends Sprite
	{
		
		private var externalHandlers = [];
		
		static private var self;
		
		static public function instance ():JSListener
		{
			
			if ( !self ) self = new JSListener ();
			
			return self;
			
		}
		
		public function JSListener ():void
		{
			
			ExternalInterface.addCallback ( "addJSListener", addJSListener ); 
			
		}
				
		public function addJSListener ( eventName:String, functionName:Function ):void
		{
			
			externalHandlers = {};
			
			if ( !( eventName in externalHandlers ) ) externalHandlers [ eventName ] = [];
			
			externalHandlers [ eventName ].push ( functionName );
			
		}
		
		public function JSEvent ( ev, param1 = null, param2 = null ):void
		{
			
			var event:Array = ( ( externalHandlers [ ev.name ] || [] ) as Array ).concat ( ( externalHandlers [ '__all__' ] || [] ) as Array );
			
			var o:Object = joinObjects ( param1, param2 );
			
			for ( var i:uint = 0, len = event.length; i < len; i++ ) ExternalInterface.call ( event [ i ], o );
			   
		}
		
		private function joinObjects ( a:Object, b:Object ):Object
		{
			
			var c:Object = {};
			
			for ( var i in a ) c [ i ] = a [ i ];
			
			for ( i in b ) c [ i ] = b [ i ];
			
			return c;
			
		}
				
	}
	
}
В классе так же предусмотрен евент "__all__", это если JSхочет слушать все события.


Использовать можно например так:

Код:
var jsEvent = JSListener.instance ().JSEvent;

jsEvent( { type:"my_event" } );
Т.е. добавляем ссылку на синглтон в область видимости класса. И генерим события.

Единственное что смущает, это то что приходится создавать синглтон и проводить инициализацию. Может можно сделать более красивое решение?


Последний раз редактировалось ALiEN_; 21.04.2008 в 15:21.