Flex 右键 功能

工具类如下:

RightClickManager.as

package com.soa
{
	import flash.display.DisplayObject;
	import flash.events.MouseEvent;
	import flash.external.ExternalInterface;

	import mx.controls.listClasses.IListItemRenderer;
	import mx.core.Application;

	public class RightClickManager
	{
		static private var rightClickTarget:DisplayObject;
		static public const RIGHT_CLICK:String="rightClick";
		static private const javascript:XML=<script>  
				<![CDATA[  
					function(flashObjectId)  
					{                 
					var RightClick = {  
					init: function (flashObjectId) {  
					this.FlashObjectID = flashObjectId;  
					this.Cache = this.FlashObjectID;  
					if(window.addEventListener){  
					window.addEventListener("mousedown", this.onGeckoMouse(), true);  
					} else {  
					document.getElementById(this.FlashObjectID).parentNode.onmouseup = function() { document.getElementById(RightClick.FlashObjectID).parentNode.releaseCapture(); }  
					document.oncontextmenu = function(){ if(window.event.srcElement.id == RightClick.FlashObjectID) { return false; } else { RightClick.Cache = "nan"; }}  
					document.getElementById(this.FlashObjectID).parentNode.onmousedown = RightClick.onIEMouse;  
					}  
					},  
					killEvents: function(eventObject) {  
					if(eventObject) {  
					if (eventObject.stopPropagation) eventObject.stopPropagation();  
					if (eventObject.preventDefault) eventObject.preventDefault();  
					if (eventObject.preventCapture) eventObject.preventCapture();  
					if (eventObject.preventBubble) eventObject.preventBubble();  
					}  
					},  
					onGeckoMouse: function(ev) {  
					return function(ev) {  
					if (ev.button != 0) {  
					RightClick.killEvents(ev);  
					if(ev.target.id == RightClick.FlashObjectID && RightClick.Cache == RightClick.FlashObjectID) {  
					RightClick.call();  
					}  
					RightClick.Cache = ev.target.id;  
					}  
					}  
					},  
					onIEMouse: function() {  
					if (event.button ==2||event.button==0) {  
					if(window.event.srcElement.id == RightClick.FlashObjectID && RightClick.Cache == RightClick.FlashObjectID) {  
					RightClick.call();   
					}  
					document.getElementById(RightClick.FlashObjectID).parentNode.setCapture();  
					if(window.event.srcElement.id)  
					RightClick.Cache = window.event.srcElement.id;  
					}  
					},  
					call: function() {  
					document.getElementById(this.FlashObjectID).rightClick();  
					}  
					}  
					
					RightClick.init(flashObjectId);  
					}  
					]]>  
			</script>;

		public function RightClickManager()
		{
			return;
		}

		static public function regist():Boolean
		{
			if (ExternalInterface.available)
			{
				ExternalInterface.call(javascript, ExternalInterface.objectID);
				ExternalInterface.addCallback("rightClick", dispatchRightClickEvent);
				Application.application.addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
			} // end if  
			return true;
		}

		static private function mouseOverHandler(event:MouseEvent):void
		{
			rightClickTarget=DisplayObject(event.target);
			//trace(rightClickTarget.name);  
			//rightClickTarget = (rightClickTarget is IListItemRenderer)?rightClickTarget:null; // 如果不是在列表上,则取消右键事件  
			return;
		}

		static private function dispatchRightClickEvent():void
		{
			var event:MouseEvent;
			if (rightClickTarget != null)
			{
				//trace(rightClickTarget)  
				event=new MouseEvent(RIGHT_CLICK, true, false, rightClickTarget.mouseX, rightClickTarget.mouseY);
				rightClickTarget.dispatchEvent(event);
			} // end if  
			return;
		}

		//添加在不希望出现右键菜单比如弹出窗口上 .执行即可  
		static public function setRightClickTargetNULL():void
		{
			rightClickTarget=null;
		}


	}
}


RightClickRegister.as

package com.soa
{
	import flash.display.Sprite;

	import mx.utils.NameUtil;

	[Event(name="rightClick", type="flash.events.MouseEvent")]
	public dynamic class RightClickRegister extends Sprite
	{
		private var rightClickRegisted:Boolean=false;

		public function RightClickRegister()
		{
			if (!rightClickRegisted)
			{
				RightClickManager.regist();
				rightClickRegisted=true;
			}
			try
			{
				name=NameUtil.createUniqueName(this);
			}
			catch (e:Error)
			{
			}
			return;
		}

		public override function toString():String
		{
			return NameUtil.displayObjectToString(this);
		}
	}
}


调用例子如下:

rightClick.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="init()">
	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>
	<fx:Script>
		<![CDATA[
			import com.soa.RightClickManager;
			import com.soa.RightClickRegister;
			
			import mx.controls.Alert;
			
			protected var rightClickRegisted:Boolean = false;
			
			private function init():void
			{
				if (!rightClickRegisted) 
				{ 
					RightClickManager.regist(); 
					rightClickRegisted = true; 
				}
				lae.addEventListener(RightClickManager.RIGHT_CLICK,treeRightClickHandler);
			}
			
			private function treeRightClickHandler(eve:MouseEvent):void
			{
				
				Alert.show((eve.target as Label).text );
			}
			private function c():void{Alert.show("2222");} 
		]]>
	</fx:Script>
	<s:Label >
		
	</s:Label>
</s:Application>

顺序说一下:

html-template/index.template.html 中需要增加

 <param name="wmode" value="opaque" />