当 wmode=opaque 或 wmode=transparent 时如何检测 Event.MOUSE_LEAVE
Posted
技术标签:
【中文标题】当 wmode=opaque 或 wmode=transparent 时如何检测 Event.MOUSE_LEAVE【英文标题】:How to detect Event.MOUSE_LEAVE when wmode=opaque or wmode=transparent 【发布时间】:2011-07-23 02:57:24 【问题描述】:我有一个自定义的拖动事件,它适用于大多数事情:
stage.addEventListener( MouseEvent.MOUSE_DOWN, beginDrag );
function beginDrag( e:MouseEvent )
stage.addEventListener( MouseEvent.MOUSE_MOVE, drag );
stage.addEventListener( MouseEvent.MOUSE_UP, endDrag );
stage.addEventListener( MouseEvent.DEACTIVATE, endDrag );
stage.addEventListener( Event.MOUSE_LEAVE, endDrag );
stage.addEventListener( Event.REMOVED_FROM_STAGE, stageEndDrag );
//trigger beginDrag event
function drag( e:MouseEvent )
//trigger drag event
function endDrag( e:Event )
stage.removeEventListener( MouseEvent.MOUSE_MOVE, drag );
stage.removeEventListener( MouseEvent.MOUSE_UP, endDrag );
stage.removeEventListener( MouseEvent.DEACTIVATE, endDrag );
stage.removeEventListener( Event.MOUSE_LEAVE, endDrag );
stage.removeEventListener( Event.REMOVED_FROM_STAGE, stageEndDrag );
//trigger endDrag event
问题是当我将此代码与wmode=transparent
或wmode=opaque
一起使用时,当MOUSE_UP
事件发生在舞台外时,MOUSE_LEAVE
事件不会被检测到。
当wmode
是transparent
或opaque
时,有没有办法检测MOUSE_LEAVE
事件?
或
有没有办法检测wmode
设置为transparent
或opaque
以便实施解决方法?
【问题讨论】:
【参考方案1】:默认情况下,MOUSE_LEAVE 不是可靠事件。有时它会被解雇,有时它不会。您可以在整个网络上find complaints about this。
不过,您可以做一件事,那就是手动检查鼠标是否在舞台上:
var out : Boolean = false;
stage.addEventListener (Event.ENTER_FRAME, checkMouse);
function checkMouse (ev:Event) : void
if (
stage.mouseX < 0 ||
stage.mouseX > stage.stageWidth ||
stage.mouseY < 0 ||
stage.mouseY > stage.stageHeight)
if (!out)
out = true;
stage.dispatchEvent (new Event(Event.MOUSE_LEAVE));
else if (out)
out = false;
stage.dispatchEvent (new Event("mouseEnter"));
这将在光标位于舞台区域之外时调度 MOUSE_LEAVE 事件,并在它重新进入时调度自定义“mouseEnter”事件。然后,您可以将事件侦听器添加到舞台以可靠地对这些事件做出反应,但您必须记住,一次可能会触发多个 MOUSE_LEAVE(如果同时执行了自定义的和内置的)。您可以检查out
变量以防止事件处理程序的双重执行。
附:我不确定这适用于所有 stage.align 和 stage.scaleMode 选项。它应该适用于 StageScaleMode.NO_SCALE 和 StageAlign.TOP_LEFT 的组合,对于您必须检查并可能找到解决方法的任何其他设置。
【讨论】:
@weltraumpirat 在此之前我从未发现MOUSE_LEAVE
事件不可靠。许多人对何时MOUSE_LEAVE
事件被触发感到困惑,因为它发生在MOUSE_UP
事件发生在鼠标离开舞台而用户离开舞台之后拖动鼠标。我发现wmode=transparent/opaque
中鼠标离开舞台时没有处理鼠标事件,所以这种方法不太可能起作用(虽然我还是会尝试一下)。
如果您遇到任何问题,您总是可以使用 ENTER_FRAME 侦听器。如果可以的话,我更喜欢使用 MOUSE_MOVE,因为它不会经常触发。
@weltraumpirat,当鼠标离开舞台时,不会触发任何鼠标事件(甚至不会触发 MOUSE_OUT
事件)。如果鼠标被释放或按下,新的鼠标事件也不会为buttonDown
注册正确的值。我看不出ENTER_FRAME
的听众有什么帮助。
我的脚本测试鼠标是否在舞台边界内。如果鼠标在舞台外,无论玩家是否触发内置事件,都会手动触发 MOUSE_LEAVE 事件。我在 MOUSE_MOVE 上测试,但如果这不起作用,ENTER_FRAME 将继续测试,即使玩家在后台。
@weltraumpirat,问题是当鼠标离开舞台(使用 wmode=transparent)时,鼠标事件没有被触发,ENTER_FRAME 会得到一个鼠标位置不准确。以上是关于当 wmode=opaque 或 wmode=transparent 时如何检测 Event.MOUSE_LEAVE的主要内容,如果未能解决你的问题,请参考以下文章
JQModal 在 iframe 上显示并使用 ?wmode=opaque
对网页上的嵌入对象使用 wmode="transparent"、"opaque" 或 "window" 之间的区别
当 wmode = 网站上的透明或不透明时,Flash swf 有时会被压扁