繁体   English   中英

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

[英]Is it possible to SIMULATE a mouse click using a mouse down and up events?

上一个问题使我开始思考。 是否可以通过仅先触发MOUSE_DOWN然后触发MOUSE_UP来模拟MouseEvent.CLICK来触发。

按照Adobe的说法。 “ ...为了使click事件发生,它必须始终按照发生的顺序跟随这一系列事件:mouseDown事件,然后是mouseUp。这两个事件的目标对象必须相同;否则,不会发生click事件在mouseDown或mouseUp事件之间的任何时间都可以发生许多其他鼠标事件;单击事件仍然发生。” http://help.adobe.com/zh_CN/FlashPlatform/reference/actionscript/3/flash/display/InteractiveObject.html#event:click

根据我的测试,它表明不是从ActionScript 3事件队列构造CLICK事件。 还是代码有问题?

看到:

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()”事件,而不是一个。

之所以不能,是因为这三种类型都是由插件创建的,并且彼此不依赖。

按下交互式对象后,将立即触发MouseEvent.MOUSE_DOWN。 释放鼠标后立即触发MouseEvent.MOUSE_UP,它不取决于在同一InteractiveObject中启动了MOUSE_DOWN的鼠标单击。 仅当两个事件都发生在同一对象中而光标没有在鼠标下移和鼠标上移的迭代之间离开该对象时,才会触发MouseEvent.CLICK。

因此,您可以看到有一种简单的情况,甚至有两种情况,都触发了MOUSE_DOWN和MOUSE_UP,但是没有调用CLICK,因为该事件不是CLICK。

此外,仅需要调用一个MouseMouseEvent.CLICK事件的能力就可以通过触发多个鼠标事件来创建虚假的用户交互,而不用担心。 必须跟踪在鼠标按下侦听器中单击的每个对象,以检查向上移动是否还会触发单击,这很尴尬。 当发生ROLL_OUT事件时,您还需要删除引用。

简而言之,CLICK事件实际上比MOUSE_DOWN和MOUSE_UP事件要多得多。 还可以管理事件在同一显示对象上连续发生而没有离开对象的情况。 当这种情况发生时,只有在这种情况下,flash才会调度CLICK事件。

这段代码是不可能的:

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');
        }       
    }   
}

输出只是:


点击了

按下键盘上的一个键后

不知道这是闪存。 但是当我学习Windows MFC时却一无所知。 我所做的是,在短暂的延迟后,我先发送了WM_MOUSEDOWN,然后发送了WM_MOUSEUP。 它确实起作用,并且按钮的视觉状态也发生了变化-无需任何鼠标单击!

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

我很好奇我是否在这里简化了解决方案,尤其是在阅读了您的代码尝试之后。 “模拟”鼠标单击非常简单。 下面的代码在单击对象时输出两个“我已被单击”语句,而当您将鼠标向下然后移出对象边界时则不输出。

此类扩展了我在舞台上创建的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时,除非按住鼠标不放),然后其他任何调度都不会再次触发。

不太清楚为什么每个人都会做出这些复杂的峰值。 也许我只是在监督一些事情。

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

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 ) );

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

...并且可能应该跟着一个反问:为什么当我也可以调度click事件时,为什么要使用一系列mousedown和mouseup模拟一个click事件?

我是一个存在生存危机的纽扣吗?

还是仅仅是出于好奇? 但是你知道那只猫发生了什么事...是的,但也许是薛定ding的猫,这意味着在这种完全不相关的思路结束时,好奇心确实杀死了猫,但并没有杀死猫。

除非猫是开箱即用的。

然后,它可能只是浪费了。

瞧,开箱即用可能会使您丧命。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM