Flex编程注意之自动获取焦点、监听全局键盘事件

简介:

Flex编程注意之自动获取焦点、监听全局键盘事件

详细请看:http://www.k-zone.cn/zblog/post/flex-air-auto-set-focus.html
这是《Flex第一步》QQ群里面一个朋友问我的问题,特此拿出分享一下。或许问题比较简单,还是将其记录一下比较好。

需求如下:
当AIR启动后,监听全局键盘事件,即this.addEventListener( KeyboardEvent.KEY_DOWN, keydownHandler );

运行后效果:
当AIR运行后,虽然正确监听了KeyboardEvent.KEY_DOWN event,但是必须要鼠标点击一下AIR才可以获取keydownHandler。

原因:
1、keydownHandler的获取需要监听的对象获得焦点,当mouse click AIR后,则相当于获取焦点。
2、只有当监听的对象获取焦点后,才能出接收到KeyboardEvent.KEY_DOWN event。

因此问题根结:
如何让监听对象自动获取焦点。

解决方案:(步骤)
1、
this.dispatchEvent( new MouseEvent( MouseEvent.CLICK ));
通过以上的方式即可让程序“自动点击”dispatchEvent的对象。

2、
获取焦点方式:
this.stage.focus = this;

片段代码如下:

  xmlns:fx="http://ns.adobe.com/mxml/2009" 
  xmlns:s="library://ns.adobe.com/flex/spark" 
  xmlns:mx="library://ns.adobe.com/flex/halo"
  creationComplete="createCompleteHandler (event)">

private function createCompleteHandler( event : FlexEvent ) : void {

  //监听ouseEvent.CLICK event
  this.addEventListener( MouseEvent.CLICK, clickHandler );
  //监听KeyboardEvent.KEY_DOWN
  this.addEventListener( KeyboardEvent.KEY_DOWN, keyDownHandler );

}

private function clickHandler( event : MouseEvent ) : void {

  this.stage.focus = this;

}

private function clickHandler( event : KeyboardEvent ) : void {

  //TO DO

}

自动触发mouse click的代码:(以下代码在this.addEventListener( KeyboardEvent.KEY_DOWN, keyDownHandler );的下面)
var timer : Timer = new Timer( 100, 1 );
timer.addEventListener( TimerEvent.TIMER_COMPLETE, function ( event : TimerEvent ) : void {

  event.target.stop();
  dispatchEvent( new MouseEvent( MouseEvent.CLICK ));

});
timer.start();
之所以用timer来处理是因为当create complete后,直接使用dispatchEvent会发现stage尚未赋值,因此需要延时一段时间处理。
注意:以上代码适用于AIR,在Flex里面按照如下写法仍旧无法获取KeyboardEvent.KEY_DOWN event。

Flex里面是如何自动获取焦点、监听全局键盘事件的呢?

原因:
Flex由于有浏览器的包裹,因此当打开浏览器后,由于SWF尚未获取焦点,因此就算自动获取了焦点(dispatchEvent( new MouseEvent( MouseEvent.CLICK ));)也是没有意义的。

解决方法:
在嵌入SWF的html里面加入如下的功能:


这句话的含义:当onload完毕后,自动设定SWF为焦点状态。

最后再按照AIR的写即可完成自动获取焦点、监听全局键盘事件。

由于代码比较少,因此就不放上demo了,以上的片段代码足以说明问题:)
本文转自jiahuafu博客园博客,原文链接http://www.cnblogs.com/jiahuafu/archive/2010/01/15/1648276.html如需转载请自行联系原作者

jiahuafu

相关文章
|
6月前
|
小程序
小程序中点击子元素事件而不触发父元素的点击事件
小程序中点击子元素事件而不触发父元素的点击事件
104 0
|
24天前
|
C#
C# 禁止ComboBox滚动事件细谈
C# 禁止ComboBox滚动事件细谈
|
4月前
关于实现点击父元素点击后显示子元素,但点击子元素不消失的方法(阻止事件传递)
关于实现点击父元素点击后显示子元素,但点击子元素不消失的方法(阻止事件传递)
17 0
|
6月前
|
JavaScript
checkbox选中和取消,控制dom元素颜色变化
checkbox选中和取消,控制dom元素颜色变化
26 0
|
JavaScript
Vue——02-06 阻止事件冒泡,阻止默认行为以及监听键盘回车事件
阻止事件冒泡,阻止默认行为以及监听键盘回车事件
299 0
|
JavaScript
13、JS事件(事件绑定、事件流、阻止事件冒泡、取消元素默认行为)
13、JS事件(事件绑定、事件流、阻止事件冒泡、取消元素默认行为)
89 0
|
Android开发
EditText默认不获取焦点,隐藏软键盘,焦点监听,输入监听,样式设置
EditText默认不获取焦点,隐藏软键盘,焦点监听,输入监听,样式设置
704 0
SwiftUI—如何实现对视图显示和消失事件的监听
SwiftUI—如何实现对视图显示和消失事件的监听
592 0
SwiftUI—如何实现对视图显示和消失事件的监听
|
JavaScript 前端开发
页面一刷新让文本框自动获取焦点-- 和自定义v-focus指令
页面一刷新让文本框自动获取焦点-- 和自定义v-focus指令
|
C#
WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件
原文:WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件 在WPF中,只有鼠标位置在某个控件上的时候才会触发该控件的鼠标事件。例如,有两个控件都注册了MouseDown和MouseUp事件,在控件1上按下鼠标,不要放开,移动到控件2上再放开。
2248 0