{ yeah : 必须哒 } No place to place should record our youth?

1Aug/100

as3右键响应事件–使用js屏蔽flash的右键菜单

Posted by ofeng

JAVASCRIPT:
[cc lang="js"]
/**
*
* Copyright 2007
*
* Paulius Uza
* http://www.uza.lt
*
* Dan Florio
* http://www.polygeek.com
*
* Project website:
* http://code.google.com/p/custom-context-menu/
*
* --
* RightClick for Flash Player.
* Version 0.6.2
*
*/

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 ( );
}
}
[/cc]

Actionscript:

[cc lang="actionscript3"]
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 0 && mx <stage.stageWidth ) {
// YOUR CODE HERE
}
}
}
}
[/cc]

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

参考:

http://www.uza.lt/blog/2007/08/solved-right-click-in-as3/

DEMO:http://www.uza.lt/rightclick/

1Aug/102

如何完全屏蔽网页中FLASH里F5刷新及功能键

Posted by ofeng

【问题需求描述】

使用flash开发的课件,交互性虽好,但是加入用户在学习过程中无意或有意按了F5,则flash会重新载入,前面的就白学了

【要解决的问题】

1.屏蔽网页里的F5刷新及功能键

2.取消由于M$改变active的机制后造成的flash空间需要激活的虚框提示

3.屏蔽焦点位于flash上时造成的针对1的解决方案所不足的刷新

【解决步骤】

1.要屏蔽网页里的F5及功能键,需要先用js判断浏览器类型,由于不同浏览器返回的事件对象以及获得事件对象keycode的方法都不一样,故用到BrowserCompatible.js来解决浏览器兼容性问题。主要代码如下:

[cc lang="js"]

//
document.onkeydown=keyDown;
function keyDown(e)
{

if(e==null)
e=BrowserCompatible.getEvent(e);
var keycode=BrowserCompatible.getKeyCode(e);

if ( keycode >=112 && keycode<=123 )
{
alert(keycode);
if(navigator.appName.indexOf("Microsoft") != -1){
e.keyCode = 0;
e.cancelBubble = true;
e.returnvalue = false;
}
return false;
//
[/cc]

2,网页的F5屏蔽和功能键都已成功,接下来就要屏蔽flash中的了,我的思路是当flash获得焦点的时候,自动将焦点再还给浏览器。具体方法如下,首先flash初始时监听mousedown事件,利用flash中的ExternalInterface.call,来调用js,使浏览器重新获得焦点。js代码如下:

[cc lang="js"]
function htmlFocus()
{
document.body.focus();
}
[/cc]

3,但是这样做的话,flash所有的键盘事件都无法被flash所获取,若需要flash获取键盘事件的话,还需把浏览器事件所产生的keycode再传回来,利用flash中的ExternalInterface.addcall()来接受js的值,具体代码如下:

[cc lang="js"]
function getMovie(movieName) {
if(navigator.appName.indexOf("Microsoft") != -1){
return window[movieName];
}
else {
if(document[movieName].length != undefined) { return document[movieName][1]; }
return document[movieName];
}
}
getMove("flash").sendKeyCode(event.keyCode);
[/cc]