哪些flash事件可以中断mouse_up事件,我该如何检测它们?

时间:2010-12-06 22:49:50

标签: flash actionscript-3 actionscript

简化代码:

//triggered on MouseEvent.MOUSE_DOWN
private function beginDrag(e:MouseEvent):void
{
  stage.addEventListener(MouseEvent.MOUSE_MOVE, drag);
  stage.addEventListener(MouseEvent.MOUSE_UP, endDrag);
  stage.addEventListener(Event.DEACTIVATE, endDrag);
  contextMenu.addEventListener(ContextMenuEvent.MENU_SELECT, endDrag);
}

private function drag(e:MouseEvent):void
{
  //do stuff
}

private function endDrag(e:Event):void
{
  stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag);
  stage.removeEventListener(MouseEvent.MOUSE_UP, endDrag);
  stage.removeEventListener(Event.DEACTIVATE, endDrag);
  contextMenu.removeEventListener(ContextMenuEvent.MENU_SELECT, endDrag);
}

我在我的flash代码中使用了一些点击并拖动技术,我注意到MOUSE_UP事件存在一些漏洞:

  • 如果在按住鼠标的同时激活上下文菜单,则不会触发它。
  • 如果窗口已停用(alt + tab或类似)
  • ,则不会触发

我的问题是: 什么其他事件可能会中断MOUSE_UP事件并导致意外行为?

此外,还有一种方法可以为所有上下文菜单一般捕获ContextMenuEvent.MENU_SELECT,而无需手动添加/删除每个上下文菜单的监听器吗?

3 个答案:

答案 0 :(得分:1)

this code might help
我用/* */来评论一切不必要的东西 如果不适合您的情况,欢迎您升级该代码

答案 1 :(得分:0)

如果编译的swf是另一个swf的子节点,则Event.REMOVED_FROM_STAGEEvent.REMOVED事件可能会触发。我相信在那种情况下,引用了拥有文档的阶段,因此仍然没有问题。

FocusEvent.FOCUS_OUT在用户放开鼠标之后才会触发,这会触发MouseEvent.MOUSE_UP事件。

看来我的原始代码运行得很好。 (如果触发了子元素的上下文菜单,则存在漏洞的可能性。)

答案 2 :(得分:-1)

MOUSE_LEAVE存在一个大问题:如果按住鼠标,则MOUSE_LEAVE is not fired.

这是我在拖动过程中模拟MOUSE_LEAVE的方法。幸运的是,当鼠标仍处于运行状态时,stage.mouseXstage.mouseY会更新。对于某些浏览器,您可能也需要MOUSE_LEAVE

    public function beginDrag(evt:MouseEvent):void
    {
        stage.addEventListener(MouseEvent.MOUSE_MOVE, drag);
        stage.addEventListener(MouseEvent.MOUSE_UP, endDrag);
        stage.addEventListener(Event.DEACTIVATE, endDrag);
        stage.addEventListener(Event.MOUSE_LEAVE, endDrag);

        _dragging = true;
    }

    public function drag(evt:MouseEvent):void
    {           
        // check if mouse has fallen off stage
        if (stage.mouseX < 0 || 
            stage.mouseY < 0 || 
            stage.mouseX > stage.stageWidth || 
            stage.mouseY > stage.stageHeight)
        {
            endDrag(evt);
            ExternalInterface.call("alert", "Dropped off");
            return;
        }

        // do drag stuff here...
    }