在做一个实验时遇到一个禁止flash的右键功能的问题。在网上找了很多方法,要不就完全不行,要不就浏览器不兼容。Google了一下国外的情况,终于找到了一个不错的方法。该方法用了javascript和as的结合,完美解决了问题。
以下是javascript部分代码:
- var RightClick = {
- /**
- * Constructor
- */
- init: function () {
- this.FlashObjectID = "customRightClick";
- this.FlashContainerID = "flashcontent";
- this.Cache = this.FlashObjectID;
- if(window.addEventListener){
- window.addEventListener("mousedown", this.onGeckoMouse(), true);
- } else {
- document.getElementById(this.FlashContainerID).onmouseup = function() { document.getElementById(RightClick.FlashContainerID).releaseCapture(); }
- document.oncontextmenu = function(){ if(window.event.srcElement.id == RightClick.FlashObjectID) { return false; } else { RightClick.Cache = "nan"; }}
- document.getElementById(this.FlashContainerID).onmousedown = RightClick.onIEMouse;
- }
- },
- /**
- * GECKO / WEBKIT event overkill
- * @param {Object} eventObject
- */
- 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();
- }
- },
- /**
- * GECKO / WEBKIT call right click
- * @param {Object} ev
- */
- 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;
- }
- }
- },
- /**
- * IE call right click
- * @param {Object} ev
- */
- onIEMouse: function() {
- if (event.button> 1) {
- if(window.event.srcElement.id == RightClick.FlashObjectID && RightClick.Cache == RightClick.FlashObjectID) {
- RightClick.call();
- }
- document.getElementById(RightClick.FlashContainerID).setCapture();
- if(window.event.srcElement.id)
- RightClick.Cache = window.event.srcElement.id;
- }
- },
- /**
- * Main call to Flash External Interface
- */
- call: function() {
- document.getElementById(this.FlashObjectID).rightClick();
- }
- }
var RightClick = { /** * Constructor */ init: function () { this.FlashObjectID = "customRightClick"; this.FlashContainerID = "flashcontent"; this.Cache = this.FlashObjectID; if(window.addEventListener){ window.addEventListener("mousedown", this.onGeckoMouse(), true); } else { document.getElementById(this.FlashContainerID).onmouseup = function() { document.getElementById(RightClick.FlashContainerID).releaseCapture(); } document.oncontextmenu = function(){ if(window.event.srcElement.id == RightClick.FlashObjectID) { return false; } else { RightClick.Cache = "nan"; }} document.getElementById(this.FlashContainerID).onmousedown = RightClick.onIEMouse; } }, /** * GECKO / WEBKIT event overkill * @param {Object} eventObject */ 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(); } }, /** * GECKO / WEBKIT call right click * @param {Object} ev */ 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; } } }, /** * IE call right click * @param {Object} ev */ onIEMouse: function() { if (event.button> 1) { if(window.event.srcElement.id == RightClick.FlashObjectID && RightClick.Cache == RightClick.FlashObjectID) { RightClick.call(); } document.getElementById(RightClick.FlashContainerID).setCapture(); if(window.event.srcElement.id) RightClick.Cache = window.event.srcElement.id; } }, /** * Main call to Flash External Interface */ call: function() { document.getElementById(this.FlashObjectID).rightClick(); } }
以下是as部分代码:
- package {
- import flash.display.*;
- import flash.external.ExternalInterface;
- public classclass RightClick extends Sprite
- {
- public function RightClick()
- {
- stage.scaleMode = StageScaleMode.NO_SCALE;
- stage.align = StageAlign.TOP_LEFT;
- var methodName:String = "rightClick";
- var method:Function = onRightClick;
- ExternalInterface.addCallback(methodName, method);
- }
- private function onRightClick():void {
- var mx:int = stage.mouseX;
- var my:int = stage.mouseY;
- if(my> 0 && my <stage.stageHeight && mx> 0 && mx <stage.stageWidth) {
- // YOUR CODE HERE
- }
- }
- }
- }
package { import flash.display.*; import flash.external.ExternalInterface; public class RightClick extends Sprite { public function RightClick() { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; var methodName:String = "rightClick"; var method:Function = onRightClick; ExternalInterface.addCallback(methodName, method); } private function onRightClick():void { var mx:int = stage.mouseX; var my:int = stage.mouseY; if(my> 0 && my <stage.stageHeight && mx> 0 && mx <stage.stageWidth) { // YOUR CODE HERE } } } }
支持的浏览器有:
WINDOWS VISTA
- Internet Explorer 7.0.6001 (16549)
- Firefox 2.0.0.6 (with mouse gestures disabled)
- Maxthon 2 (with mouse gestures disabled)
- Safari 3.0.3 (522.15.5)
Windows XP SP2
- Internet Explorer 6
- Internet Explorer 7
- Maxthon 2 (with mouse gestures disabled)
- FireFox 2 (with mouse gestures disabled)
- Safari 3
- Netscape 8
Mac OSX 10.4.10 (Intel)
- Firefox 2
- Safari 3.0.3
毕竟是国外的产品,似乎对某些国产浏览器支持不好,拥有最多用户的maxthon浏览器如果开启鼠标手势就不被支持。解决方法还在尝试中。
项目地址:http://code.google.com/p/custom-context-menu/
牛牛猪的Demo首页查看:http://niuniuzhu.cn
作者Demo地址:http://www.uza.lt/rightclick/