zoukankan      html  css  js  c++  java
  • 关于Flex屏蔽默认右键菜单,捕获右键事件

    关于Flex屏蔽默认右键菜单,捕获右键事件

    JScript code


    1.如果你是Desktop Application
    监听事件的MouseEvent.RIGHT_CLICK事件
    比如对某个控件a进行监控右键点击事件
    a.addEventListener(MouseEvent.RIGHT_CLICK,func);
    鼠标的其他事件也可以监听,具体见http://livedocs.adobe.com/flex/3_cn/langref/flash/events/MouseEvent.html
    2.如果是Web Appliction(麻烦了!)
    其基本思路为:

    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中测试通过
    http://www.flex-flex.net/blog/article.asp?id=12



  • 相关阅读:
    软件工程之系统建模篇【设计用例模型】
    软件工程之系统建模篇【设计用例控制类模型】
    软件工程之系统建模篇【设计系统类模型】
    软件工程之系统建模篇【设计数据模型】
    软件工程之系统建模篇【设计实体类型模型】
    软件工程之系统建模篇【设计接口类型模型】
    10-crop
    过拟合:训练集误差低,测试集误差高
    【事件冒泡】
    vscode设置缩进为2个空格
  • 原文地址:https://www.cnblogs.com/nianshi/p/1790287.html
Copyright © 2011-2022 走看看