1.     了解键盘事件的优先权<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

你过你同时为一个控件和包含它的容器定义了keyUpkeyDown事件监听器,你将注意到键盘事件会被调度到每一个组件上的监听器,因为事件冒泡。唯一的不同更在于KeyBordEvent对象的currentTarget属性发生了变化。

 

在下面的例子中,my_vbox容器和my_textinput控件都调度keyUp事件到keyHandler()事件处理器函数:

 

<?xml version="1.0"?>

<!-- events/KeyboardEventPrecedence.mxml -->

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp();">

<mx:Script><![CDATA[

private function initApp():void {

application.addEventListener(KeyboardEvent.KEY_UP, keyHandler);

my_vbox.addEventListener(KeyboardEvent.KEY_UP, keyHandler);

my_textinput.addEventListener(KeyboardEvent.KEY_UP, keyHandler);

// Set the focus somewhere inside the application.

my_textinput.setFocus();

}

private function keyHandler(event:KeyboardEvent):void {

ta1.text += event.target + "(" + event.currentTarget + "): " +

event.keyCode + "/" + event.charCode + "\n";

}

]]></mx:Script>

<mx:VBox id="my_vbox">

<mx:TextInput id="my_textinput"/>

</mx:VBox>

<mx:TextArea id="ta1" height="300" width="550"/>

</mx:Application>

 

当你检查输出,你将注意到target属性始终是相同的,因为它引用了原始的调度者(在这个例子中是my_textinput),但是currentTarget属性变了当前的节点。

 

事件监听器的调用顺序是由对象等级而不是addEventListener()方法的调用顺序决定的。子控件会先于容器调度事件。在这个例子中,文本输入控件第一个调度事件,接下来是VBox调度事件,最后是application调度事件。

 

当处理一个可以被操作系统或浏览器识别的按键或组合键时,操作系统或浏览器会通常会率先处理事件。例如,在IE浏览器中,当按下Control+w关时,窗口将会关闭。如果你在程序中捕获这个组合键,那么IE的用户将永远不知道程序的这个功能,浏览器已经在ActiveX Flash Player有机会响应事件之前关闭了浏览器。

 

2.     处理与键盘相关的鼠标事件

MouseEvent类和所有MouseEvent的子类都有下面的属性来使你能够确定当鼠标事件发生时是否有一个特殊的键被按下:

 

altKey:如果当用户按下鼠标建时Alt键已经被按住,则返回true,否则返回false

ctrlKey:如果当用户按下鼠标建时Control键已经被按住,则返回true,否则返回false

shiftKey:如果当用户按下鼠标建时Shift键已经被按住,则返回true,否则返回false

 

在下面的例子中,当用户在按下Shift键的同时点击鼠标,按钮控件将被删除:

 

<?xml version="1.0"?>

<!-- events/DetectingShiftClicks.mxml -->

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp();">

<mx:Script><![CDATA[

import mx.controls.Button;

private function initApp():void {

var b1:Button = new Button();

b1.label = "Button 1";

var b2:Button = new Button();

b2.label = "Button 2";

b1.addEventListener(MouseEvent.CLICK, removeButtons);

b2.addEventListener(MouseEvent.CLICK, removeButtons);

vb1.addChild(b1);

vb1.addChild(b2);

}

private function removeButtons(event:MouseEvent):void {

if (event.shiftKey) {

vb1.removeChild(Button(event.currentTarget));

} else {

event.currentTarget.toolTip = "Shift+click to remove this button.";

}

}

]]></mx:Script>

<mx:VBox id="vb1"/>

<mx:Button id="resetButton" label="Reset" click="initApp();"/>

</mx:Application>