是否可以使用鼠标向下和向上事件模拟鼠标单击?

时间:2011-09-24 19:47:07

标签: actionscript-3 flex actionscript mouseevent

之前的一个问题让我想到了。是否可以通过首先触发MOUSE_DOWN然后触发MOUSE_UP来模拟MouseEvent.CLICK被触发。

根据Adobe的推文。 “...对于要发生的点击事件,它必须始终按照发生的顺序跟随这一系列事件:mouseDown事件,然后是mouseUp。这两个事件的目标对象必须相同;否则不会发生click事件任何数量的其他鼠标事件都可以在mouseDown或mouseUp事件之间的任何时间发生; click事件仍然会发生。“ http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/InteractiveObject.html#event:click

从我的测试中可以看出,CLICK事件不是从ActionScript 3事件队列构造的。或者代码有问题吗?

见:

package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;

[SWF(backgroundColor="0xFFFFFF", frameRate="30", width="800", height="600")]

public class Test extends Sprite
{
    private var spr:Sprite = new Sprite();
    public function Test()
    {
        trace("Test()");
        this.addEventListener(Event.ADDED_TO_STAGE,init);
    }
    public function init(e:Event):void
    {
        trace("init()");
        spr.graphics.beginFill(0xFF0000);
        spr.graphics.drawRect(0,0,200,80);
        spr.graphics.endFill();
        addChild(spr);
        addEventListener(Event.ENTER_FRAME, onEnterFrame);
        spr.addEventListener(MouseEvent.CLICK, onClick);
    }
    private var tick:int = 0;
    private function onEnterFrame(e:Event):void
    {
        if (tick == 1) spr.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_DOWN,true,false));
        if (tick == 2) spr.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_UP,true,false));
        if (tick == 3) spr.dispatchEvent(new MouseEvent(MouseEvent.CLICK,true,false));
        tick++;
    }
    private function onClick(e:MouseEvent):void
    {
        trace("onClick() MouseEvent.CLICK dispatched"); 
    }
}
}

我应该得到两个'onClick()'事件而不是一个。

5 个答案:

答案 0 :(得分:3)

你不能这样做的原因是这三种类型都是由插件创建的,并且不依赖于彼此。

只要按下交互式对象,就会触发MouseEvent.MOUSE_DOWN。 释放鼠标后会立即触发MouseEvent.MOUSE_UP,它不依赖于鼠标单击已在同一InteractiveObject中启动MOUSE_DOWN。 MouseEvent.CLICK仅在两个事件发生在同一对象中时触发,而光标不会在鼠标向下和鼠标向上的对象之间留下对象。

所以你可以看到有一个简单的情况,或两个偶数,其中MOUSE_DOWN和MOUSE_UP都被触发,但是因为事件不是CLICK而没有调用CLICK。

此外,简单地调度MouseEvent.CLICK事件的能力使得在只调用一个鼠标事件时通过触发多个鼠标事件来创建虚假用户交互是不必要的。必须跟踪在鼠标按下侦听器中单击的每个对象是很尴尬的,以便检查moue也应该触发单击。当ROLL_OUT事件发生时,您还需要删除引用。

简而言之,CLICK事件实际上远远超过MOUSE_DOWN和MOUSE_UP事件。它还管理事件连续发生在同一显示对象上而不离开对象。当发生这种情况时,只有当发生这种情况时,flash才会调度CLICK事件。

答案 1 :(得分:2)

这是不可能的,这段代码:

package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.events.MouseEvent;

    /**
     * ...
     * @author www0z0k
     */
    public class Main extends Sprite {

        public function Main():void {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            stage.addEventListener(MouseEvent.CLICK, onClick);
            stage.addEventListener(KeyboardEvent.KEY_DOWN, onStageKeyDown);
        }

        private function onStageKeyDown(e:KeyboardEvent):void {
            trace('pressed');
            stage.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_DOWN));
            stage.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_UP));           
            stage.dispatchEvent(new MouseEvent(MouseEvent.CLICK));          
        }

        private function onClick(e:MouseEvent):void{
            trace('clicked');
        }       
    }   
}

只输出:

  


  点击

在键盘上按下键后

答案 2 :(得分:0)

对闪光灯不确定。但是,当我学习Windows MFC并且无能为力。我做的是在短暂的延迟后发送WM_MOUSEDOWN后跟WM_MOUSEUP。它确实有效,按钮的视觉状态也发生了变化 - 没有任何鼠标点击!

答案 3 :(得分:0)

如果我理解你的要求,那么答案是肯定的。

我很好奇,如果我在此处简化了解决方案,尤其是在阅读了您的代码尝试之后。 “模拟”鼠标点击非常简单。单击对象时,下面的代码会输出两个“我被点击”的语句,当你鼠标按下然后移出对象边界时,没有输出。

这个类扩展了我在舞台上创建的MovieClip,所以我没有必要编写一个盒子。

package  {

import flash.display.MovieClip;
import flash.events.MouseEvent;


public class clickMe extends MovieClip {


    public function clickMe() {
        // constructor code

        this.addEventListener(MouseEvent.CLICK, clicked);
        this.addEventListener(MouseEvent.MOUSE_DOWN, mDown);

    }

    private function clicked(e:MouseEvent):void{
        trace("I have been clicked");
        this.removeEventListener(MouseEvent.MOUSE_UP, clicked);
    }

    private function mDown(e:MouseEvent):void{
        this.addEventListener(MouseEvent.MOUSE_UP, clicked);
    }
}
}

在你的代码中我认为问题在于你试图通过“onEnterFrame”运行事件监听器调度,它只会每帧触发一个事件 - 从不两次。在测试你的代码后,我不确定你用“tick”变量试图完成什么,因为你从未重置它。因此,MOUSE_UP事件触发一次(当tick = 2时,除非你按住鼠标),否则其他任何调度都不会再次触发。

答案 4 :(得分:0)

不太确定为什么每个人都在制造这些复杂的尖峰。或许我只是在监督某些事情。

无论如何,这是一个非常简单的检查方法:

import flash.events.MouseEvent;

stage.addEventListener(MouseEvent.CLICK, function(){
    trace( 'clicked' );
} );

stage.dispatchEvent( new MouseEvent( MouseEvent.MOUSE_DOWN ) );
stage.dispatchEvent( new MouseEvent( MouseEvent.MOUSE_UP ) );

答案是,“不,这不可能” ......

...并且可能应该跟一个反问题:为什么我想使用mousedown和mouseup序列来模拟点击事件,当我可以同时发送点击事件时?

我是一个存在危机的按钮吗?

或者仅仅是出于好奇心的问题?但是你知道猫发生了什么......对,但也许是schrödinger的猫,这意味着在这完全不相干的思路结束时,好奇心真的做了,并没有杀死猫。

除非猫是开箱即用的。

然后它可能只是浪费了。

看,开箱即用可以让你死亡。