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

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)
}


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

你可能感兴趣的:(PHP,浏览器,Flash,bbs)