http://bbs.9ria.com/viewthread.php?tid=83888&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000
该死的浏览器 火狐应该被枪毙。。
透明模式下 火狐和谷歌浏览器中的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)
}
抛砖引玉 欢迎大家讨论 看看有没有更好的办法 解决 滚轮问题