Jac*_*rdt 4 apache-flex flash actionscript-3 textfield
我正在为关键字创建输入字段,而用户正在编写我在插入符号位置下方的列表上显示关键字的建议.输入字段是单行,因此我使用向上/向下箭头键选择建议,然后按Enter键插入.它主要是工作,但有一个很大的例外,即向上/向下键也会将插入位置改变为插入/结束TextField.
我已经尝试过使用preventDefault()并且stopImmediatePropagation()在KeyboardEvent.KEY_DOWN事件监听器中我也用来更改所选的建议,但这并没有改变任何东西.当KeyboardEvent.KEY_DOWN事件被触发时,我检查了carret还没有移动,视觉上我可以看到它在释放钥匙之前正在移动(按键).
我可以保存插入位置,然后重置默认行为.但这恰恰涉及一些使用计时器的类似黑客的代码.
那么有谁知道如何防止默认行为?
你不能阻止它,但你可以扭转它.为此,您可以向同一事件添加具有不同优先级的处理程序 - KeyboardEvent.DOWN.一个将在TextField之前执行,并保存选择索引,另一个在恢复之后执行.工作代码如下:
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import mx.controls.TextInput;
import mx.events.FlexEvent;
public class FooledTextInput extends TextInput
{
private var ssi : int = 0;
private var sei : int = 0;
public function FooledTextInput()
{
super();
this.addEventListener(KeyboardEvent.KEY_DOWN, onBeforeKeyDown, false, 10000);
this.addEventListener(KeyboardEvent.KEY_DOWN, onAfterKeyDown, false, -10000);
}
private function onBeforeKeyDown(e : KeyboardEvent) : void
{
if (e.keyCode == Keyboard.UP || e.keyCode == Keyboard.DOWN)
{
ssi = this.selectionBeginIndex;
sei = this.selectionEndIndex;
}
}
private function onAfterKeyDown(e : KeyboardEvent) : void
{
if (e.keyCode == Keyboard.UP || e.keyCode == Keyboard.DOWN)
{
this.setSelection(ssi, sei);
}
}
}
Run Code Online (Sandbox Code Playgroud)
你可能想要更好的ssi(选择开始索引)和sei(选择结束索引)的名字,我懒得找一些.我认为这个解决方案基于Alex Harui的帖子,我记不清楚了,但他的博客上有很多与Flex相关的好东西.
更新:对于spark TextInput,不仅可以防止,它真的很容易.您需要做的就是在捕获阶段捕获事件并停止传播.码:
package
{
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import spark.components.TextInput;
public class HackedTextInput extends TextInput
{
public function HackedTextInput()
{
super();
addEventListener(KeyboardEvent.KEY_DOWN, onBeforeKeyDown, true);
}
private function onBeforeKeyDown(e:KeyboardEvent) : void
{
if (e.keyCode == Keyboard.UP || e.keyCode == Keyboard.DOWN)
{
e.stopImmediatePropagation();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意addEventListener调用中的最后一个参数,该参数设置为true,以便在捕获阶段调用处理程序.遗憾的是,此解决方案不适用于mx TextInput,仅适用于spark one.
| 归档时间: |
|
| 查看次数: |
4436 次 |
| 最近记录: |