以前的问题让我想到了。是否可以模拟一个MouseEvent.CLICK,通过首先触发一个MOUSE_DOWN和一个MOUSE_UP来触发。是否可以使用鼠标向下和向上事件来模拟鼠标点击?
按照Adobe的说法。 “...对于发生的点击事件,它必须始终按照以下顺序发生:mouseDown事件,然后是mouseUp。这两个事件的目标对象必须相同;否则,click事件不会在mouseDown或mouseUp事件之间的任何时候都可能发生任何其他鼠标事件;点击事件仍然发生。 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()' 事件,而不是一个。
你说得对。当它看到一个MOUSE_DOWN后面跟着一个MOUSE_UP时,它不会创建一个新的CLICK事件(可能是因为在事件循环代码中这样做会非常奇怪,而且在鼠标输入处理代码中生成该事件更自然)。你将不得不手动全部三个。我认为文档是指定期鼠标事件;手动触发它们,不太可能有任何特殊的代码来执行事件顺序。 – Cameron
我认为这个文档有点混乱。点击事件是通过鼠标向下+鼠标在同一个对象上生成的。所有三个ActionScript事件都作为结果分派。运行时不会使用ActionScript事件本身来确定是否分派点击事件。 –