- 浏览: 91854 次
- 性别:
- 来自: 上海
文章分类
最新评论
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;
}
}
到此就完了. 还是那句话. 没有最适合您的. 只有自己动手.丰衣足食
贴上几个右键图片效果
两个右键判断权限后.菜生成的. 对比下效果
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;
}
}
到此就完了. 还是那句话. 没有最适合您的. 只有自己动手.丰衣足食
贴上几个右键图片效果
两个右键判断权限后.菜生成的. 对比下效果
发表评论
-
flex输出在IE提示:Alternate HTML content should be placed here. This content requires
2013-06-13 18:17 0在flex输出的时候,在IE上提示:Alterna ... -
Flex Ant自动构建
2012-10-26 16:21 0Flex Ant自动构建 2012-03-29 17: ... -
Flex之事件及事件机制
2012-08-17 14:14 0Flex事件概述 Flash/Flex ... -
flex收藏
2012-08-16 17:41 01.复制内容到系统剪贴板 System.setClipb ... -
java和flex读取properties文件
2012-07-20 11:07 2601java和flex读取properties文件 ... -
flex缓存
2012-06-13 18:19 1309我们在用Flex开发应用的 ... -
将视频文件转换成flv
2012-01-06 11:48 0package mature; import java.io ... -
flex java通信协议(收藏共享)
2012-01-06 11:26 1451flex java通信协议 如何将 Flex 和 Sprin ... -
Firefox环境下使用Flash Player 9的debug版本
2011-09-26 10:11 0Firefox环境下使用Flash Player 9的debu ...
相关推荐
如果不做特殊处理,Js捕捉不到右键双击事件。而在某些情况下,控制不了网页的鼠标右键双击事件,使得我们的web应用处于失控状态,给浏览者带来不愉快的感受,因此,捕捉并控制鼠标右键的双击事件就很有必要了。 本...
在VB (Visual Basic) 应用程序中,`...总的来说,通过以上步骤,我们可以在VB中成功实现`WebBrowser`控件的右键屏蔽功能。这不仅可以应用于简单的VB应用程序,也可以扩展到更复杂的系统中,作为安全控制的一部分。
2. 使用`Interaction.InputBox`方法弹出输入框,获取用户输入的新名称,并检查其是否为空。如果不为空,则更新节点文本。 四、新建节点 1. “新建”菜单项的点击事件处理程序通常会打开一个对话框,允许用户输入新...
使用html模拟实现右键双击,此代码对右键响应有速度较快,可实现快速连续双击,在谷歌地图开发时可能会用到
目的:替换鼠标右键 使用方式:双击软件即是右键,建议固定到任务栏,按快捷键win+数字(固定位置)
标题“双击磁盘无效,需右键打开”所描述的问题是常见的计算机操作系统中的一个现象,用户在尝试访问硬盘分区时,发现双击无响应,只能通过右键菜单选择“打开”来进入。这种情况通常与系统设置、磁盘驱动器关联、...
当用户右键单击时,可以弹出一个菜单,让用户选择裁剪操作。裁剪操作可能包括设置新的裁剪区域,或者对当前图形进行裁剪。在OpenGL中,这可能涉及到重新计算裁剪窗口,然后调用glScissor更新裁剪区域,之后再绘制...
3. MainFrm.cpp:这是主框架(MainFrame)类的源代码,通常包含应用程序的主窗口和菜单处理逻辑,也可能包含了托盘图标的主要交互代码。 4. TRAYICON.CPP:这是一个非常关键的文件,很可能包含了前面提到的TRAYION...
Win10 系统通过双击本注册表项来合并注册表,可以实现在文件夹内(包括在桌面)通过 Shift+鼠标右键在当前位置打开管理员 Powershell 窗口。 修改后效果: 以桌面为例,通过Shift+鼠标右键,会多出来一个“在此处...
在本文中,我们将深入探讨如何实现ZTree的右键菜单功能,这是一种常见的JavaScript技术,用于在树形数据结构中提供用户交互。ZTree是一个强大的、可定制的jQuery插件,常用于构建树状目录和组织结构。让我们首先了解...
标题“win10右键在此处打开命令行窗口”指的是在Windows 10操作系统中,通过右键菜单快速启动命令提示符(CMD)的功能。这一功能对于经常需要使用命令行工具的用户来说非常方便,无需每次都手动导航到相应目录再打开...
为了解决这个问题,我们可以采取一定的方法来屏蔽外接触摸屏的右键功能。这个过程并不复杂,只需要按照以下步骤操作即可: 首先,我们需要找到触摸屏驱动的相关设置。通常,触摸屏驱动是由制造商提供的,并安装在你...
该文件里有2个压缩包:BC3ShellExFix.zip + BC4ShellExFix.zip,分别是Beyond compare3和Beyond compare4的右键菜单修复方法,具体如下: 这里介绍Beyond compare4,在32位PC机上的右键菜单修复方法: 1)先把BC4...
autohotkey 双击右键为粘贴 非常方便 也不影响右键正常功能
右键-在此处打开CMD, 双击即可修改注册表使得能够在文件上右键可以打开cmd
1. "点此启动(右键菜单管理).bat" - 这是一个批处理文件,用户通过双击它来启动右键菜单管理工具,执行相关的脚本命令。 2. "MiniUI.dll" - 这是一个动态链接库文件,可能包含了该工具的用户界面组件,使得程序有更...
在这个特定的案例中,"双击右键显示桌面程序VB源码"是一个使用VB编写的程序,它的功能是通过钩子技术来捕获并处理鼠标右键双击事件,使得用户在大多数情况下双击右键即可快速切换到桌面,提高了操作效率。...
通过"右键小精灵",我们可以在此基础上扩展这些选项,定制出符合个人习惯的操作方式。 "Addeasy.chm"文件是一个帮助文件,通常包含软件的使用指南、功能介绍和常见问题解答。CHM是Microsoft的 Compiled HTML Help ...
XP双击打开文件或右键文件及桌面鼠标右键等打开很慢解决方法
2. 解压完成后,找到并双击“windows11右键显示所有项目.bat”文件。 3. 在打开的窗口中,由于该操作涉及系统级别的更改,所以需要以管理员权限运行。右键点击该批处理文件,选择“以管理员身份运行”。 4. 批处理...