2011-03-30 57 views
6

我试图在advancedDataGrid中处理mouseWheel事件,但未成功。没有任何额外的代码,我的adg可以在IE浏览器中滚动滚动,但不是在Firefox和Chrome中,为什么?为什么这些浏览器的行为有所不同?Chrome和Firefox中的MouseWheel

然后我尝试这种代码,但它不工作:

protected function adgMouseWheelHandler(event:MouseEvent):void 
{ 
    event.delta = event.delta > 0 ? 1 : -1; 
} 

,然后设置事件MouseWheel在我的ADG这样的:

<mx:AdvancedDataGrid id="myADG" width="100%" height="100%" color="0x323232" 
        dataProvider="{_currentDatosBusqueda}" verticalScrollPolicy="auto" 
        fontSize="11" fontFamily="Arial" fontStyle="normal" 
        fontWeight="normal" doubleClickEnabled="true" 
        itemDoubleClick="dobleClickFilaDataGridBusqueda(event);" 
        useRollOver="true" mouseWheel="adgMouseWheelHandler(event);" 
     > 

任何想法?

谢谢!

回答

7

当wmode =“opaque”(它实际上在IE中工作时,不是Firefox或Chrome,可能不是Safari或Opera)修复Flex应用程序中的MouseWheel。这也修复了Firefox和其他一切之间不同的MouseWheel滚动速率。

将此JavaScript添加到您的包装: 。

 if(window.addEventListener) { 
      var eventType = (navigator.userAgent.indexOf('Firefox') !=-1) ? "DOMMouseScroll" : "mousewheel";    
      window.addEventListener(eventType, handleWheel, false); 
     } 

     function handleWheel(event) { 
      var app = document.getElementById("YOUR_APPLICATION"); 
      var edelta = (navigator.userAgent.indexOf('Firefox') !=-1) ? -event.detail : event.wheelDelta/40;         
      var o = {x: event.screenX, y: event.screenY, 
       delta: edelta, 
       ctrlKey: event.ctrlKey, altKey: event.altKey, 
       shiftKey: event.shiftKey} 

      app.handleWheel(o); 
     } 

而放弃这一支持类到您的主MXML文件(声明为FLEX4): 。

package { 
import flash.display.InteractiveObject; 
import flash.display.Shape; 
import flash.display.Stage; 
import flash.events.MouseEvent; 
import flash.external.ExternalInterface; 
import flash.geom.Point; 

import mx.core.FlexGlobals; 
import mx.core.UIComponent; 
import mx.events.FlexEvent; 

public class MouseWheelSupport { 

    //-------------------------------------- 
    // Constructor 
    //-------------------------------------- 

    public function MouseWheelSupport() { 
     FlexGlobals.topLevelApplication.addEventListener(FlexEvent.APPLICATION_COMPLETE, attachMouseWheelHandler); 
    } 

    //------------------------------------------------------------------------------ 
    // 
    // Functions 
    // 
    //------------------------------------------------------------------------------ 

    //-------------------------------------- 
    // Private 
    //-------------------------------------- 

    private function attachMouseWheelHandler(event : FlexEvent) : void { 
     ExternalInterface.addCallback("handleWheel", handleWheel); 
    } 

    private function handleWheel(event : Object) : void { 
     var obj : InteractiveObject = null; 
     var applicationStage : Stage = FlexGlobals.topLevelApplication.stage as Stage; 

     var mousePoint : Point = new Point(applicationStage.mouseX, applicationStage.mouseY); 
     var objects : Array = applicationStage.getObjectsUnderPoint(mousePoint); 

     for (var i : int = objects.length - 1; i >= 0; i--) { 
      if (objects[i] is InteractiveObject) { 
       obj = objects[i] as InteractiveObject; 
       break; 
      } 
      else { 
       if (objects[i] is Shape && (objects[i] as Shape).parent) { 
        obj = (objects[i] as Shape).parent; 
        break; 
       } 
      } 
     } 

     if (obj) { 
      var mEvent : MouseEvent = new MouseEvent(MouseEvent.MOUSE_WHEEL, true, false, 
                mousePoint.x, mousePoint.y, obj, 
                event.ctrlKey, event.altKey, event.shiftKey, 
                false, Number(event.delta)); 
      obj.dispatchEvent(mEvent); 
     } 
    } 
} 
} 

JavaScript示例:

<script type="text/javascript"> 
     // For version detection, set to min. required Flash Player version, or 0 (or 0.0.0), for no version detection. 
     var swfVersionStr = "10.1.0"; 
     // To use express install, set to playerProductInstall.swf, otherwise the empty string. 
     var xiSwfUrlStr = "playerProductInstall.swf"; 
     var flashvars = {}; 
     var params = {}; 
     params.quality = "high"; 
     params.bgcolor = "#ffffff"; 
     params.allowscriptaccess = "sameDomain"; 
     params.allowfullscreen = "true"; 
      params.wmode = "opaque"; 
     var attributes = {}; 
     attributes.id = "YOURAPP"; 
     attributes.name = "YOURAPP"; 
     attributes.align = "middle"; 

      if(window.addEventListener) { 
       var eventType = (navigator.userAgent.indexOf('Firefox') !=-1) ? "DOMMouseScroll" : "mousewheel";    
       window.addEventListener(eventType, handleWheel, false); 
      } 

      function handleWheel(event) { 
       var app = document.getElementById("YOURAPP"); 
       var edelta = (navigator.userAgent.indexOf('Firefox') !=-1) ? -event.detail : event.wheelDelta/40;         
       var o = {x: event.screenX, y: event.screenY, 
        delta: edelta, 
        ctrlKey: event.ctrlKey, altKey: event.altKey, 
        shiftKey: event.shiftKey} 

       app.handleWheel(o); 
      } 

     swfobject.embedSWF(
      "YOURAPP.swf", "flashContent", 
      "100%", "100%", 
      swfVersionStr, xiSwfUrlStr, 
      flashvars, params, attributes); 
     // JavaScript enabled so display the flashContent div in case it is not replaced with a swf object. 
     swfobject.createCSS("#flashContent", "display:block;text-align:left;"); 

    </script> 
+0

感谢您的回复。首先,我开始拿掉param wmode(默认情况下是不透明的),并且在IE,Chrome和FF中都可以正常工作,但是如果你不把它设置为“窗口”,它只会在win2中推荐。我想使用我的应用程序在移动设备(与Android),这将是一个问题?然后,我尝试了你所说的,但我不知道关于JavaScript的任何内容,因此我将该代码放入我的history.js和index-template(以及main.mxml中的其他代码)中,但未取得成功。请问您能否多给我解释一下? – alicia 2011-03-31 08:54:11

+0

您是否使用Flash Builder生成HTML包装器? – 2011-03-31 16:29:34

+0

是的,我使用Flash Builder – alicia 2011-03-31 17:15:18

0

这也符合“的wmode”,“透明”一样, 从嵌入HTML的JavaScript部分拆除违规行,如果它是由Flash生成的..而一切都在好世界firefox 40.0