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

flex 屏蔽鼠标右键

    博客分类:
  • FLEX
阅读更多
屏蔽FLEX右键菜单以及实现自定义的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增加
<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

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

private var mouseTarget:DisplayObject;
function init()
{
ExternalInterface.addCallback("openRightClick", openRightClick);
}


function getMouseTarget(event:MenuEvent):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",
  "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的加载和外部接口建立成功后,再加以使用.

转自http://blog.csdn.net/zhaodog/archive/2007/06/12/1648481.aspx
分享到:
评论

相关推荐

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

    在Flex中,当用户在组件上点击鼠标右键时,通常会弹出默认的系统级右键菜单。为了屏蔽这个菜单,我们需要覆盖组件的`creationComplete`事件,然后监听`contextMenu`事件。在事件处理函数中,我们可以设置`event....

    Flex 实现右键菜单

    在ActionScript中,我们可以监听`contextMenu`事件,当用户点击鼠标右键时,阻止默认的事件处理,从而实现屏蔽浏览器的系统菜单。以下是一个简单的示例: ```actionscript stage.addEventListener(ContextMenuEvent...

    flex自制右键菜单

    本项目标题为"flex自制右键菜单",描述中提到作者从网上获取了相关代码并进行改写,实现了屏蔽Flex默认的右键菜单以及动态生成右键菜单的功能。下面我们将详细探讨Flex中如何实现这一目标。 首先,Flex是由Adobe...

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

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

    flex 右键菜单 屏蔽原来的

    这通常涉及到阻止浏览器的默认事件处理,可以通过在事件处理函数中调用`event.preventDefault()`来实现,但这需要对组件或舞台添加鼠标右键点击事件监听器: ```actionscript stage.addEventListener(MouseEvent....

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

    关于“屏蔽菜单”,在Flex 3中,我们可以通过覆盖默认的鼠标右键事件来达到效果。在组件类中,我们可以监听`MouseEvent.RIGHT_CLICK`事件,并在事件处理函数中阻止事件的默认行为: ```actionscript myComponent....

    flex 自定义右键菜单

    这通常涉及到监听鼠标右键点击事件,然后动态生成并显示菜单。 - 首先,你需要监听`MouseEvent.RIGHT_CLICK`事件。 ``` myComponent.addEventListener(MouseEvent.RIGHT_CLICK, onRightClick); function ...

    flex自定义右键菜单

    这时,我们需要监听鼠标右键点击事件,并手动弹出自定义菜单。以下是一个简单的实现: ```actionscript myDisplayObject.addEventListener(ContextMenuEvent.MENU_SHOW, onContextMenuShow); function ...

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

    标题提到的"Flash 11.2新功能,Flex屏蔽右击菜单"是指在使用Adobe Flash Player 11.2及Flex框架进行开发时,如何阻止用户通过鼠标右键点击在应用程序上弹出默认的上下文菜单,以及如何自定义自己的右键菜单。...

    Flex的组件

    这篇博文主要讨论的是如何在Flex应用中屏蔽右键菜单,这对于提供更整洁的用户体验和防止不必要的用户操作是非常有用的。 首先,让我们理解为什么要屏蔽右键菜单。在许多应用程序中,特别是那些具有高度交互性的Web...

Global site tag (gtag.js) - Google Analytics