AS3 发表于 2013-1-28 09:34:16

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

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 staticvar _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)                              {                                        tempArr = null;                              }                        }                                                for( var i:int = Arr.length-1; i>=0 ; i--)                        {                              if(Arr == dis)                              {                                        Arr.splice(i,1);                              }                        }                }                              public function mouseoverfun(evt:MouseEvent):void                {                        for each (varg:Array in Arr)                        {                              if(g==evt.currentTarget)                              {                                                      tempArr = g;                              }                        }                }                              public function mouseoutfun(evt:MouseEvent):void                {                        for each (varg:Array in Arr)                        {                              if(g==evt.currentTarget)                              {                                        tempArr = null;                              }                        }                }                              //js滚轮事件                public function JSHandleWheel(n:Number): void               {                           if(!WheelTool.JSWheelBoo)                        {                              return;                        }                        if(tempArr != null)                        {                              tempArr(n);                        }                }                                 //flash滚轮事件                public function FlashHandleWheel(evt:MouseEvent): void               {                                                   if(WheelTool.JSWheelBoo)                        {                              if(stage.displayState != "fullScreen")                              {                                        return;                              }                        }                        if(tempArr != null)                        {                              tempArr(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)
}


抛砖引玉欢迎大家讨论 看看有没有更好的办法 解决 滚轮问题
页: [1]
查看完整版本: [转] 自己写的针对透明模式下的滚轮类,解决浏览器问题