`
anreddy
  • 浏览: 99856 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

屏蔽Flex右键,并实现自定义右键菜单

阅读更多
完全屏蔽FLEX右键菜单比当初想象的要难一些,因为大多数FLEX文档中仅仅介绍了如何隐藏一部分FLEX右键菜单,例如:

var contextMenu : ContextMenu = new ContextMenu();
contextMenu.hideBuiltInItems(); // 隐藏一些内建的鼠标右键菜单项

但是这个功能不能隐藏"设置"和"关于"右键菜单,而在一些应用中,希望能够利用鼠标右键完成一些操作功能,例如绘图程序和游戏等,这时候右键菜单就是"欲除之而后快"了.但在FLEX中监听mouseDown捕获不了右键事件,而在ContextMenu的Select事件也无法屏蔽.

在网上发现了一篇相关的BLOG,地址如下:
http://www.flex-flex.net/blog/article.asp?id=12

其基本思路为:

1,在FLEX中利用外部接口注册一个函数, 作为接收外部(HTML)右键事件的入口
2,在FLEX应用所在的HTML中拦截鼠标右键事件,调用FLEX外部函数,并取消事件的广播,以阻止事件到达FLEX应用.
3,在FLEX应用程序上监听mouseOver事件,并记录当前鼠标所在对象
4,当入口函数接收到HTML发送的右键事件后,模拟生成一个鼠标右键事件(buttonDown = false), 并发送到当前对象
5,在对象的mouseDown处理函数中,根据buttonDown的标志,分别处理鼠标左右键事件


这个思路比较清晰可行, 鼠标右键事件的流程为:

HTML鼠标右键事件----FLEX外部函数-----模拟的鼠标右键事件------相应的处理函数

具体的实现为:

1, 在FLEX所在的HTML增加(注意根据自己的OBJECT ID更改"FlexTest")
<script>
function onNsRightClick(e){
if(e.which == 3){
  FlexTest.openRightClick();
  e.stopPropagation();
}
return false;
}

function onIeRightClick(e){
if(event.button > 1){
  FlexTest.openRightClick();
  parent.frames.location.replace('javascript: parent.falseframe');
}
return false;
}


if(navigator.appName == "Netscape"){
document.captureEvents(Event.MOUSEDOWN);
document.addEventListener("mousedown", onNsRightClick, true);
}
else{
document.onmousedown=onIeRightClick;
}

</script>

2, 修改FLEX的MXML

增加初始化和MOUSEOVER事件处理函数

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"  initialize="init()" mouseOver="getMouseTarget(event)" >

增加MX SCRIPT

import mx.events.MenuEvent;
import mx.controls.Alert;
 
private var mouseTarget:DisplayObject;
function init()
{
ExternalInterface.addCallback("openRightClick", openRightClick);
}

function getMouseTarget(event:MouseEvent):void
{
   mouseTarget = DisplayObject(event.target);
}

function openRightClick():void
{
var e:MouseEvent = new MouseEvent(MouseEvent.MOUSE_DOWN, true, false, mouseTarget.mouseX, mouseTarget.mouseY);
mouseTarget.dispatchEvent(e);
}

function showMouseEvent(event)
{
if(event.buttonDown == true)
  Alert.show("Left");
else
  Alert.show("Right");
}


<mx:Image x="0" y="10" id="bbb" name="bbb" source="res/15.jpg" mouseDown="showMouseEvent(event)" height="247"/>


在修改完后,满怀信心的进行测试,结果右键菜单还能够出现!试了很多办法也不行,幸亏我的同事赵辉发现了解决方法,在这里向他表示感谢!

具体的方法就是修改wmode参数, 将wmode设置为opaque或transparent都可以达到这个效果
AC_FL_RunContent(
  "src", "playerProductInstall",
  "FlashVars", "MMredirectURL="+MMredirectURL+'&MMplayerType='+MMPlayerType+'&MMdoctitle='+MMdoctitle+"",
  "width", "100%",
  "height", "100%",
  "align", "middle",
  "id", "FlexTest",            //// OBJECT ID
  "wmode", "opaque",  //////////////////////注意:这里是关键
  "quality", "high",
  "bgcolor", "#869ca7",
  "name", "FlexTest",
  "allowScriptAccess","sameDomain",
  "type", "application/x-shockwave-flash",
  "pluginspage", "http://www.adobe.com/go/getflashplayer"
);

ADOBE文档中对wmode的解释:
Sets the Window Mode property of the SWF file for transparency, layering, and positioning in the browser. Valid values of wmode are window, opaque, and

transparent.

Set to window to play the SWF in its own rectangular window on a web page.

Set to opaque to hide everything on the page behind it.

Set to transparent so that the background of the HTML page shows through all transparent portions of the SWF file. This can slow animation performance.

To make sections of your SWF file transparent, you must set the alpha property to 0. To make your application's background transparent, set the alpha

property on the <mx:Application> tag to 0.

The wmode property is not supported in all browsers and platforms.

现在就可以灵活的使用鼠标右键功能了!在IE6和FF2.0中测试通过


当然还有几个问题:
1,据JOVE的介绍,在IE7中需要添加
  event.stopPropagation();
  event.cancelBubble = true;
  因此还需要对浏览器进行一下判断,我没有装IE7,也就没有测,需要的朋友可以测试一下
2,一些有用的右键菜单,例如TEXT中能够自动弹出剪贴复制等功能的右键菜单,也没有了,真是有一利必有一弊啊! 不过这个还比较简单,可以再模拟一个ContextMenu的Select事件.
3, 对初始化流程应再进行一些改进,以保证FLEX的加载和外部接口建立成功后,再加以使用.
分享到:
评论
2 楼 anreddy 2010-03-22  
请参考下面的例子
<?xml version="1.0"?>
<!-- events/StoppingPropagation.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="init(event);">
<mx:Script><![CDATA[
import mx.controls.Alert;
import flash.events.MouseEvent;
import flash.events.Event;
public function init(e:Event):void {
p1.addEventListener(MouseEvent.MOUSE_DOWN, showAlert);
tw1.addEventListener(MouseEvent.MOUSE_DOWN, showAlert);
tw1.addEventListener(Event.CLOSE, closeWindow);
p2.addEventListener(MouseEvent.MOUSE_DOWN, showAlertWithoutStoppingPropagation);
tw2.addEventListener(MouseEvent.MOUSE_DOWN, showAlertWithoutStoppingPropagation);
tw2.addEventListener(Event.CLOSE, closeWindow);
}
public function showAlert(e:Event):void {
Alert.show("Alert!\n" + "Current Target: " + e.currentTarget + "\n" +
"Phase: " + e.eventPhase);
e.stopImmediatePropagation();
}
public function showAlertWithoutStoppingPropagation(e:Event):void {
Alert.show("Alert!\n" + "Current Target: " + e.currentTarget + "\n" +
"Phase: " + e.eventPhase);
}
public function closeWindow(e:Event):void {
p1.removeChild(tw1);
}
]]></mx:Script>
<mx:Panel id="p1" title="Stops Propagation">
<mx:TitleWindow id="tw1"
width="300"
height="100"
showCloseButton="true" title="Title Window 1"
>
<mx:Button label="Click Me"/>
<mx:TextArea id="ta1"/>
</mx:TitleWindow>
</mx:Panel>
<mx:Panel id="p2" title="Does Not Stop Propagation">
<mx:TitleWindow id="tw2"
width="300"
height="100"
showCloseButton="true"
title="Title Window 2"
>
<mx:Button label="Click Me"/>
<mx:TextArea id="ta2"/>
</mx:TitleWindow>
</mx:Panel>
</mx:Application>
1 楼 sungptxy 2009-08-02  
在哪加  event.stopPropagation();
  event.cancelBubble = true; 啊

相关推荐

    flex屏蔽系统右键菜单 & 自定义菜单

    在实际项目中,可能包含了自定义右键菜单的完整实现,包括ActionScript代码、MXML布局和相关的资源文件。 通过以上步骤,我们可以在Flex应用中实现屏蔽系统右键菜单并创建自定义菜单的功能,提升应用的交互性和用户...

    FLEX 完全屏蔽系统默认右键菜单,实现自定义菜单

    完全屏蔽flex自带的右键菜单,实现自定义右键菜单,附件有完整可运行的例子。 这个问题折腾了一天多,在网上搜了很多资料,几乎都是一样的,转来转去,且讲的不明不白。这里我提供了可运行的全部代码,让你轻松搞定...

    flex自定义右键菜单 完全屏蔽

    标题提到的"flex自定义右键菜单 完全屏蔽"是指在Flex应用程序中,不仅实现对默认右键菜单的完全屏蔽,还允许开发者根据自己的需求创建并应用自定义的右键菜单。这种方法避免了使用JavaScript进行跨域通信来实现屏蔽...

    Flex右键菜单例子

    总之,"Flex右键菜单例子"是一个针对Flex开发者的实用教程,它展示了如何在Flex应用,特别是使用OpenScales地图库的应用中,自定义右键菜单并屏蔽系统默认的右键行为。这个例子将帮助开发者提升用户体验,确保地图...

    Flex 3完整的右键自定义菜单Demo

    在压缩包中的"RightClickDemo"文件中,包含了完整的示例代码和运行资源,可以帮助开发者更直观地理解和学习如何在Flex 3环境中实现自定义右键菜单。通过分析和运行这个Demo,你可以了解每个部分的功能,以及它们是...

    flex自定义右键菜单

    在Flex开发中,自定义右键菜单是一项常见的需求,它能提供更加个性化和功能丰富的交互体验。本篇文章将深入探讨如何在Flex应用中实现自定义的右键菜单,包括两种主要的方法:系统右键菜单的扩展和完全屏蔽系统菜单以...

    flex 右键菜单 屏蔽原来的

    但如果我们想屏蔽原有的右键菜单,就需要在显示自定义菜单的同时,阻止默认的右键行为。这通常涉及到阻止浏览器的默认事件处理,可以通过在事件处理函数中调用`event.preventDefault()`来实现,但这需要对组件或舞台...

    flex 自定义右键菜单

    本文将深入探讨两种实现Flex自定义右键菜单的方法:系统右键菜单的扩展以及完全自定义的右键菜单。 1. **系统右键菜单** 系统右键菜单是在Flex应用中利用ActionScript 3.0直接添加到UI组件上的菜单项。这种实现...

    Flex 实现右键菜单

    这段代码会阻止默认的右键菜单弹出,为我们的自定义右键菜单提供空间。 接下来,我们将构建自定义的右键菜单。在Flex中,我们可以使用`ContextMenu`类来创建菜单,而`ContextMenuItem`类则用于创建菜单项。如果需要...

    flex自制右键菜单

    在Flex开发中,自定义右键菜单是一项常见的需求,它能提供更为丰富的用户交互体验,同时也能更好地符合应用的功能需求。本项目标题为"flex自制右键菜单",描述中提到作者从网上获取了相关代码并进行改写,实现了屏蔽...

    网页中屏蔽flash右键 RightClick 0.70,超有效

    在这个项目中,`rightClick.js`可能通过监听Flash对象的鼠标事件,并阻止默认的右键菜单显示,从而达到屏蔽右键的功能。开发者可能需要将这段代码嵌入到HTML页面中,并与Flash对象关联,以实现屏蔽效果。 `LICENSE....

    Flex自定义右健菜单

    本文将介绍两种方法来实现Flex自定义右键菜单。 方法一: 1. **屏蔽内置右键菜单**:首先,我们需要在HTML模板文件(如`Index.template.html`)中引入两个JavaScript文件,`swfobject.js`和`rightClick.js`,用于...

    flash11.2新功能,Flex屏蔽右击菜单

    总之,屏蔽和自定义右键菜单是提高用户体验和控制应用程序行为的重要方式。通过理解AS3和Flex的基本事件处理机制,以及`ContextMenu`类的使用,开发者可以轻松实现这一功能。在Flash Player 11.2及更高版本中,这些...

    Flex的组件

    总结来说,这篇关于“Flex的组件”的博文探讨了如何在Flex应用中屏蔽右键菜单,这是通过监听`contextmenu`事件并调用`event.preventDefault()`来实现的。同时,我们还了解了Flex项目结构中的几个关键文件和目录的...

    Flex中利用IFrame解决嵌入HTML时Flex组件被遮挡和IFrame被隐藏的问题

    1. **Flex组件被遮挡**:由于Flex和HTML的渲染机制不同,当HTML内容被加载到IFrame中时,可能会覆盖Flex组件,导致菜单、弹出界面或右键菜单等不可见。解决这个问题的关键在于调整Z-index,即设置IFrame和Flex组件的...

Global site tag (gtag.js) - Google Analytics