以前的問題讓我想到了。是否可以模擬一個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事件本身來確定是否分派點擊事件。 –