完美实现TextArea内按Enter发送消息并清空内容

Posted by Albert Zhang at 6 August 2009

Category: Flex 迷你教程

Tags: ,

利用KeyboardEvent.KEY_DOWN和TextEvent.TEXT_INPUT事件结合,可以用FlashPlayer 10中的TextArea完美实现消息发送框的功能。包括:

按Enter键立即发送消息、消息发送后立即清空TextArea、同时按Ctrl/Shift+Enter回车换行。

原理是:先判断KEY_DOWN事件中按下的是什么键,如果是Shift/Ctrl+Enter,则用代码向TextArea中插入一个换行符(这里flashplayer 9和10不一样,在9中按ctrl+Enter默认就是换行,而10不会,所以要用代码插入)。如果只按下了Enter,则在TEXT_INPUT事件处理中用preventDefault()来阻止默认的换行动作。

代码如下:

?View Code ACTIONSCRIPT3
//下面三个变量用来保存KEY_DOWN事件时键盘的状态
 
var shiftKey:Boolean;
 
var ctrlKey:Boolean;
 
var keyCode:int;
 
var messageInput:TextArea;
 
messageInput.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);
 
messageInput.addEventListener(TextEvent.TEXT_INPUT,onTextInput);
 
private function onKeyDown(e:KeyboardEvent):void{
 
//如果按下Enter时还按下Shift/Ctrl,则换行
 
if( e.keyCode==Keyboard.ENTER && (e.shiftKey || e.ctrlKey) ){
 
callLater(function():void{ //注意这个callLater
 
var msg:String = messageInput.text;
 
var part1:String = msg.substring(0, messageInput.selectionBeginIndex);
 
var part2:String = msg.substring(messageInput.selectionEndIndex, 0x7fffffff);
 
var selIndex:int = messageInput.selectionBeginIndex + 1;
 
messageInput.text = part1 + "\n" + part2;
 
messageInput.setSelection(selIndex,selIndex);
 
});
 
keyCode = -1; //标识本次按键不需要TEXT_INPUT事件配合处理
 
return;
 
}
 
shiftKey = e.shiftKey;
 
ctrlKey = e.ctrlKey;
 
keyCode = e.keyCode;
 
}
 
private function onTextInput(evt:TextEvent):void{
 
if(keyCode == -1){
 
return;
 
}
 
if(keyCode==Keyboard.ENTER && !shiftKey && !ctrlKey){
 
evt.preventDefault();
 
callLater(function():void{
 
//sendMessage()即为发送消息的方法,它应该返回一个Boolean值,以此来决定是否清空消息框
 
if( sendMessage(messageInput.text) ){
 
messageInput.text = "";
 
messageInput.htmlText = "";
 
messageInput.setSelection(0,0);
 
}
 
});
 
}
 
}

9 Comments

  1. an9 says

    技术贴,纯路过。

    Reply

  2. zhuzhu says

    方法感觉好麻烦啊,写的还不错

    Reply

  3. 亦歌 says

    这个不错,反正是现成的,麻烦点没关系,哈哈。

    Reply

  4. 九站 says

    这个倒是行。不过人们都习惯了用Enter换行,用了这个直接就发了,造成消息不完整。

    Reply

  5. arwinwhitt says

    decadal 1998 2009 forward newsletter beta

    Reply

  6. zwwooooo says

    现在对flash一窍不通了……

    Reply

  7. sdsd says

    谢谢楼主了

    Reply

Leave a Reply

Leave a Reply
  • (required)
  • (required) (will not be published)