守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 585|回复: 0

[AIR技术] wmode为opaque或transparent不支持鼠标滚轮的解决

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51840
    钢镚
    1422

    开源英雄守望者

    发表于 2015-1-9 11:06:50 | 显示全部楼层 |阅读模式

    在chrome等浏览器会有这个问题, 需要在html页面用js捕捉滚轮事件,然后传入到flash里面,难点是到flash之后该怎么办,我这里采用类类似冒泡的方式来触发事件。

    js代码(参考自:http://www.denisdeng.com/?p=685

    1. function wheel(obj, fn ,useCapture){
    2.   var mousewheelevt=(/Firefox/i.test(navigator.userAgent))? "DOMMouseScroll" : "mousewheel"
    3.   //FF doesn't recognize mousewheel as of FF3.x
    4.   if (obj.attachEvent)
    5.   //if IE (and Opera depending on user setting)
    6.   obj.attachEvent("on"+mousewheelevt, handler, useCapture);
    7.   else if (obj.addEventListener)
    8.   //WC3 browsers
    9.   obj.addEventListener(mousewheelevt, handler, useCapture);
    10.   function handler(event) {
    11.     var delta = 0;
    12.     var event = window.event || event ;
    13.     var delta =  event.detail ?  -event.detail/3 : event.wheelDelta/120;
    14.     if (event.preventDefault)
    15.     event.preventDefault();
    16.     event.returnValue = false;
    17.     return fn.apply(obj, [event, delta]);
    18.   }
    19. }

    20. function addMouseWheelListener(){
    21.   var target = document.getElementById('flashobjID');
    22.   wheel(target,callWheel);
    23. }

    24. function callWheel(e,delta) {
    25.   var target = document.getElementById('flashobjID');
    26.    if(target!=undefined && target && target.fireWheel)
    27.      {
    28.                  //调用flash的方法
    29.          target.fireWheel(delta);   
    30.      }
    31. }

    32. //页面加载完,附近鼠标事件侦听
    33. window.onload = addMouseWheelListener;
    复制代码
    flash代码:

    1. ExternalInterface.addCallback('fireWheel', function(delta:int):void{

    2.   //获取当前鼠标下面的所有对象
    3.   var arr:Array = stage.getObjectsUnderPoint(new Point(stage.mouseX, stage.mouseY));
    4.   if (arr.length == 0) return;
    5.   //只找最接近鼠标的那一层来触发就好了,底下的挡住了不管
    6.   var obj:DisplayObject = arr[arr.length-1];
    7.   //从叶子节点,一层一层往根上找
    8.   while (true)
    9.   {
    10.     if (obj is InteractiveObject)
    11.     {
    12.       var intobj:InteractiveObject = obj as InteractiveObject;
    13.       
    14.       if (intobj is TextField)
    15.       {
    16.         //TextField似乎不接受外部触发的滚轮事件,只能暴力
    17.         if ((intobj as TextField).mouseEnabled)
    18.         {
    19.           (intobj as TextField).scrollV -= delta;
    20.         }
    21.       }
    22.       else if (obj.hasEventListener(MouseEvent.MOUSE_WHEEL))
    23.       {
    24.         var me:MouseEvent = new MouseEvent(MouseEvent.MOUSE_WHEEL, false, false, 0, 0, intobj);
    25.         me.delta = delta;
    26.         obj.dispatchEvent(me);
    27.       }
    28.     }
    29.     if (obj == stage || (!obj.parent))
    30.     {
    31.       break;
    32.     }
    33.     obj = obj.parent;
    34.   }

    35. });
    复制代码
    作者:YoYo,原文地址:http://yoyo.play175.com/p/206.html


    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2020-6-3 16:52 , Processed in 0.043469 second(s), 31 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表