[转] 自己写的针对透明模式下的滚轮类,解决浏览器问题

[url]http://bbs.9ria.com/viewthread.php?tid=83888&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000[/url]

该死的浏览器 火狐应该被枪毙。。
透明模式下 火狐和谷歌浏览器中的flash无法使用滚轮事件。我这边的项目又需要有DIV浮在flash上面 所以 只能走JS滚轮了

思路是 建立一个数组存放需要使用滚轮的显示对象。注册鼠标OVER 和OUT事件来 处理焦点问题(FLASH 不好找焦点在谁手上,只有自己这样写了。 当然这样也存在着 两个需要滚轮的对象不能是父子关系,需要时平级关系) 当获取JS的滚轮事件 传递到该类,通知该显示对象指定的方法 告诉它 你该滚了。 另外在全屏模式 JS是使用不了的。所以要判断是否是全屏 来切换使用 滚轮事件(用JS还是用FLASH自己的)

先是JS部分

function GetFlash()
{
return document.getElementById("Flash");
}
if(!(document.attachEvent))
{
window.addEventListener("DOMMouseScroll", handleWheel, false);
}
window.onmousewheel = document.onmousewheel = handleWheel;

function handleWheel(e)
{
if (GetFlash())
{
var t1
if(e.wheelDelta){
t1 = Number(e.wheelDelta)/40;
}else if(e.detail){
t1 = Number(e.detail)
}
GetFlash().handleWheel(t1);
}
}


再是滚轮类

package Wheel
{
import flash.display.DisplayObjectContainer;
import flash.display.InteractiveObject;
import flash.display.Stage;
import flash.events.FocusEvent;
import flash.events.FullScreenEvent;
import flash.events.MouseEvent;
import flash.external.ExternalInterface;

//JS滚轮调用 kinghost80

public class WheelTool
{

public var Arr:Array =new Array(); //需要被控制的数组 包含 一个现实对象 和一个方法
private static var _instance:WheelTool = new WheelTool();
public static var JSWheelBoo:Boolean = false;
public var tempArr:Array;
public var stage:Stage;
//全屏模式下调用JS无效


public function WheelTool()
{
if (_instance)
{
throw new Error("只能用getInstance()来获取实例");
}
}

//初始化把舞台对象搞进来并决定是否使用JS滚轮 TRUE为使用JS
public function Init(s:Stage , boo:Boolean= false):void
{
WheelTool.JSWheelBoo = boo;
stage =s;

ExternalInterface.addCallback("handleWheel", JSHandleWheel);
stage.addEventListener(MouseEvent.MOUSE_WHEEL , FlashHandleWheel);
}


public static function getInstance():WheelTool
{
return _instance;
}
//加入显示对象和滚轮移动时候调用的方法
public function Add(dis:DisplayObjectContainer , fun:Function):void
{
Arr.push(new Array(dis ,fun));
dis.addEventListener(MouseEvent.MOUSE_OVER , mouseoverfun);
dis.addEventListener(MouseEvent.MOUSE_OUT , mouseoutfun);
}

public function Del(dis:DisplayObjectContainer = null):void
{
if(tempArr!= null)
{
if(dis == tempArr[0])
{
tempArr = null;
}
}

for( var i:int = Arr.length-1; i>=0 ; i--)
{
if(Arr[i][0] == dis)
{
Arr.splice(i,1);
}
}
}

public function mouseoverfun(evt:MouseEvent):void
{
for each (var g:Array in Arr)
{
if(g[0]==evt.currentTarget)
{

tempArr = g;
}
}
}

public function mouseoutfun(evt:MouseEvent):void
{
for each (var g:Array in Arr)
{
if(g[0]==evt.currentTarget)
{
tempArr = null;
}
}
}

//js滚轮事件
public function JSHandleWheel(n:Number): void
{
if(!WheelTool.JSWheelBoo)
{
return;
}
if(tempArr != null)
{
tempArr[1](n);
}
}

//flash滚轮事件
public function FlashHandleWheel(evt:MouseEvent): void
{

if(WheelTool.JSWheelBoo)
{
if(stage.displayState != "fullScreen")
{
return;
}
}
if(tempArr != null)
{
tempArr[1](evt.delta);
}
}
}
}


最后是调用方法
初始化部分
var k:WheelTool = WheelTool.getInstance();
k.Init(this.stage,true);

调用部分
public var JSW:WheelTool = WheelTool.getInstance(); //外挂滚轮
JSW.Add(this ,MouseWheelEventFun);

//滚轮事件
public function MouseWheelEventFun(n:Number):void
{
trace(n)
}


抛砖引玉 欢迎大家讨论 看看有没有更好的办法 解决 滚轮问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值