Chrome和Firefox中的MouseWheel
问题描述:
我试图在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);"
>
任何想法?
谢谢!
答
当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>
答
这也符合“的wmode”,“透明”一样, 从嵌入HTML的JavaScript部分拆除违规行,如果它是由Flash生成的..而一切都在好世界firefox 40.0
感谢您的回复。首先,我开始拿掉param wmode(默认情况下是不透明的),并且在IE,Chrome和FF中都可以正常工作,但是如果你不把它设置为“窗口”,它只会在win2中推荐。我想使用我的应用程序在移动设备(与Android),这将是一个问题?然后,我尝试了你所说的,但我不知道关于JavaScript的任何内容,因此我将该代码放入我的history.js和index-template(以及main.mxml中的其他代码)中,但未取得成功。请问您能否多给我解释一下? – alicia 2011-03-31 08:54:11
您是否使用Flash Builder生成HTML包装器? – 2011-03-31 16:29:34
是的,我使用Flash Builder – alicia 2011-03-31 17:15:18