`

转载 rightclickmanager 双击弹出窗口 右键屏蔽问题 flex 右键

    博客分类:
  • flex
 
阅读更多
rightclickmanager 双击弹出窗口 右键屏蔽问题 flex 右键

FlexFlashCacheJavaScript工作
网上关于 rightclickmanager 类似的 flex 自定义右键文章数不胜数.

但是选择的话.还需要根据每个用户的操作来选择使用那一种方式.

比如这个
Flex屏蔽并自定义鼠标右键菜单

就是别人自己封装了rightclickmanager并且扩展了一些功能. 将用户的代码工作量减低减少

但是有一点 : 过多的封装就降低了灵活性, 这种类型有个局限性, 就是如果需要在点击右键通过远程方法

来设置右键信息. 比如使用cairngorm远程调用java来返回右键的菜单和ennable等信息时,就不适用了

这个时候就需要另一个

FLEX 屏闭系统右键菜单,及在列表控件DataGrid\Tree\List上点右键时自动选择当前行

虽说好是好. 每个人都做过改动. 这点大家要看清. 适合别人的并不一定就是最适合自己的. 像这个封装的不多. 但是如果要添加右键的话 . 代码的工作量相比上一个就多了.  如果您的工程远程交互比较强, 右键信息需要在运行时动态改变. 就得自己再做一些修改了.



------------------------------------------------------------------------------------------------------------------------


放上自己修改的 rightclickmanager  代码, 没有过多封装,比较灵活. 也减少了页面载入的代码量.

就两个类  RightClickManager.as  和 RightClickRegister.as(这个是将第一个例子的代码拿来使用,拿来主义么. 减少代码量)

RightClickManager.as


Java代码 
package com.thams.contextMenu.utils 

    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; 
        } 
         
         
    } 

 



setRightClickTargetNULL 方法 是本人添加的一个方法. 因为遇到这么一个问题.
一个datagrid 列表. 需要显示右键 , 其他都正常. 但是如果在条目上双击打开一个弹出窗口后.因为鼠标上次悬停对象仍然是datagird , 碰巧. 弹出窗口又是遮罩的(遮罩层无法获取鼠标over事件).这样 rightClickTarget 这个对象就是上次那个对象不为空. 这个时候.在弹出窗口上右键点击. 还会出现.

所以本人增加了这么一个方法. 在需要屏蔽右键的 PopUpManager 之前.调用一下

Java代码 
RightClickManager.setRightClickTargetNULL();// 设置弹出窗口上的右键信息失效 
例如本人的双击方法:


Java代码 
/**
* 双击执行事件
*/ 
protected function dataDoubleClickFunction():void 

    RightClickManager.setRightClickTargetNULL();// 设置弹出窗口上的右键信息失效 
    var _index:Index = this.parentApplication as Index; 
    if(_index.currentState=="sjzbState"||_index.currentState=="daglState"){ 
        _index.sjzbMain.dataGridFrame.setDtableGridObject(dtableGrid); 
        _index.sjzbMain.dataGridFrame.edit(); 
    } 
     




这样就防止了如果在鼠标没有移出监听区域打开一个遮罩窗口. 右键还存在的一个bug.


RightClickRegister.as

Java代码 
package com.thams.contextMenu.utils 

    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); 
        } 
 
    } 

这个类没什么好说的. 拿来主义 . 嘿嘿


下面说下如何使用:

因为只要注册过一次监听后. 整个工程的右键就都会屏蔽 .故本人推荐.直接在application中屏蔽掉算. (反正右键迟早都是要屏蔽的.换成自己的右键)

1. 在application 初始化方法中 new 一个RightClickRegister

例如:
Java代码 
private function init():void{ 
                new RightClickRegister();  
                var br:IBrowserManager = BrowserManager.getInstance(); 
                br.setTitle("王^林**系统"); 
            } 
这样这个application种(相信您的工程不会有多个应用吧. 有的话.就在需要屏蔽右键的地方加上这么一句话)

2. 在需要自定义右键的地方 加入监听


Java代码 
this.addEventListener(RightClickManager.RIGHT_CLICK,rightClickHandler); 


事件:
本人这里右键是通过 模块不同. 和选择的数据条目不同. 去后台判断权限生成右键的.所以右键定义在 cairngorm的回调方法中

Java代码 
protected function rightClickHandler(event:MouseEvent):void   
            {   
                removeMenu();   
                var label:String; 
                if(dtableGrid.dataLoaderClass.attr == 0){ 
                    label = "档案管理"; 
                } 
                if(dtableGrid.dataLoaderClass.attr == 1){ 
                    label = "收集整编"; 
                } 
                CairngormEventDispatcher.getInstance().dispatchEvent(new ContextMenuClassEvent(label,dtableGrid.selectedItems,contextMenuInitData)); 
            } 

cairngorm的回调方法:

Java代码 
private function contextMenuInitData(contextMenuItems:ArrayCollection):void{ 
                //contextMenuItems 是从后台获取的右键Array集合,即右键信息 
                menu = Menu.createMenu(this, contextMenuItems, false);   
                 
                menu.labelField="caption"    
                menu.variableRowHeight = true;      
                //menu.addEventListener(MenuEvent.ITEM_CLICK, menuItemClickHandler);        
                 
//              var point:Point = new Point(mouseX,mouseY);   
//              point = localToGlobal(point);    
                menu.show(stage.mouseX,stage.mouseY);    
                 
            } 
如果您不嫌麻烦的话. 还是在页面上写个方法吧. 不希望在页面上点击多次右键. 出现一堆右键吧

Java代码 
/** 
             * 如果显示过Menu,则先释放资源 
             *  
             */        
            private function removeMenu():void   
            {   
                if(menu!=null)   
                {   
                    menu.hide();   
                    //menu.removeEventListener(MenuEvent.ITEM_CLICK,menuItemClickHandler);   
                    menu=null;   
                }   
            }   
             

到此就完了. 还是那句话. 没有最适合您的. 只有自己动手.丰衣足食

贴上几个右键图片效果


两个右键判断权限后.菜生成的. 对比下效果




分享到:
评论

相关推荐

    捕捉鼠标右键双击

    如果不做特殊处理,Js捕捉不到右键双击事件。而在某些情况下,控制不了网页的鼠标右键双击事件,使得我们的web应用处于失控状态,给浏览者带来不愉快的感受,因此,捕捉并控制鼠标右键的双击事件就很有必要了。 本...

    vb WebBrowser屏蔽右键

    在VB (Visual Basic) 应用程序中,`...总的来说,通过以上步骤,我们可以在VB中成功实现`WebBrowser`控件的右键屏蔽功能。这不仅可以应用于简单的VB应用程序,也可以扩展到更复杂的系统中,作为安全控制的一部分。

    C#TreeView窗体版点击右键弹出菜单+直接修改名称+新建节点

    2. 使用`Interaction.InputBox`方法弹出输入框,获取用户输入的新名称,并检查其是否为空。如果不为空,则更新节点文本。 四、新建节点 1. “新建”菜单项的点击事件处理程序通常会打开一个对话框,允许用户输入新...

    html模拟右键双击

    使用html模拟实现右键双击,此代码对右键响应有速度较快,可实现快速连续双击,在谷歌地图开发时可能会用到

    鼠标右键工具类(双击右键)mouseRightButton.exe

    目的:替换鼠标右键 使用方式:双击软件即是右键,建议固定到任务栏,按快捷键win+数字(固定位置)

    双击磁盘无效,需右键打开

    标题“双击磁盘无效,需右键打开”所描述的问题是常见的计算机操作系统中的一个现象,用户在尝试访问硬盘分区时,发现双击无响应,只能通过右键菜单选择“打开”来进入。这种情况通常与系统设置、磁盘驱动器关联、...

    opengl+mfc图形裁剪(右键单击裁剪、右键双击重绘)

    当用户右键单击时,可以弹出一个菜单,让用户选择裁剪操作。裁剪操作可能包括设置新的裁剪区域,或者对当前图形进行裁剪。在OpenGL中,这可能涉及到重新计算裁剪窗口,然后调用glScissor更新裁剪区域,之后再绘制...

    托盘例子。包括右键双击

    3. MainFrm.cpp:这是主框架(MainFrame)类的源代码,通常包含应用程序的主窗口和菜单处理逻辑,也可能包含了托盘图标的主要交互代码。 4. TRAYICON.CPP:这是一个非常关键的文件,很可能包含了前面提到的TRAYION...

    [注册表]Windows10文件夹内Shift+右键菜单添加打开管理员Powershell窗口

    Win10 系统通过双击本注册表项来合并注册表,可以实现在文件夹内(包括在桌面)通过 Shift+鼠标右键在当前位置打开管理员 Powershell 窗口。 修改后效果: 以桌面为例,通过Shift+鼠标右键,会多出来一个“在此处...

    ztree右键菜单源码

    在本文中,我们将深入探讨如何实现ZTree的右键菜单功能,这是一种常见的JavaScript技术,用于在树形数据结构中提供用户交互。ZTree是一个强大的、可定制的jQuery插件,常用于构建树状目录和组织结构。让我们首先了解...

    win10右键在此处打开命令行窗口

    标题“win10右键在此处打开命令行窗口”指的是在Windows 10操作系统中,通过右键菜单快速启动命令提示符(CMD)的功能。这一功能对于经常需要使用命令行工具的用户来说非常方便,无需每次都手动导航到相应目录再打开...

    在win7下屏蔽外接触摸屏右键

    为了解决这个问题,我们可以采取一定的方法来屏蔽外接触摸屏的右键功能。这个过程并不复杂,只需要按照以下步骤操作即可: 首先,我们需要找到触摸屏驱动的相关设置。通常,触摸屏驱动是由制造商提供的,并安装在你...

    Beyond compare右键菜单修复方法.rar

    该文件里有2个压缩包:BC3ShellExFix.zip + BC4ShellExFix.zip,分别是Beyond compare3和Beyond compare4的右键菜单修复方法,具体如下: 这里介绍Beyond compare4,在32位PC机上的右键菜单修复方法: 1)先把BC4...

    双击右键为粘贴

    autohotkey 双击右键为粘贴 非常方便 也不影响右键正常功能

    右键-在此处打开CMD,双击修改注册表

    右键-在此处打开CMD, 双击即可修改注册表使得能够在文件上右键可以打开cmd

    右键管理工具-右键管理工具

    1. "点此启动(右键菜单管理).bat" - 这是一个批处理文件,用户通过双击它来启动右键菜单管理工具,执行相关的脚本命令。 2. "MiniUI.dll" - 这是一个动态链接库文件,可能包含了该工具的用户界面组件,使得程序有更...

    双击右键显示桌面程序VB源码

    在这个特定的案例中,"双击右键显示桌面程序VB源码"是一个使用VB编写的程序,它的功能是通过钩子技术来捕获并处理鼠标右键双击事件,使得用户在大多数情况下双击右键即可快速切换到桌面,提高了操作效率。...

    右键小精灵(鼠标右键添加助手)

    通过"右键小精灵",我们可以在此基础上扩展这些选项,定制出符合个人习惯的操作方式。 "Addeasy.chm"文件是一个帮助文件,通常包含软件的使用指南、功能介绍和常见问题解答。CHM是Microsoft的 Compiled HTML Help ...

    鼠标右键打开很慢

    XP双击打开文件或右键文件及桌面鼠标右键等打开很慢解决方法

    windows11右键显示所有项目.rar

    2. 解压完成后,找到并双击“windows11右键显示所有项目.bat”文件。 3. 在打开的窗口中,由于该操作涉及系统级别的更改,所以需要以管理员权限运行。右键点击该批处理文件,选择“以管理员身份运行”。 4. 批处理...

Global site tag (gtag.js) - Google Analytics