I extended flash.text.TextField for this
Main.as
package
{
import com.text.TextField;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TextEvent;
public class Main extends Sprite
{
private var textField:TextField = new TextField();
public function Main() {
this.addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
}
private function addedToStageHandler(e:Event):void
{
this.removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
textField.border = true;
textField.type = "input";
textField.wordWrap = true;
textField.multiline = true;
textField.addEventListener(TextEvent.TEXT_INPUT, textInputHandler, false, 1);
textField.addEventListener(Event.CHANGE, textChangeHandler);
this.addChild(textField);
}
private function textInputHandler(event:TextEvent):void
{
if(event.text == "a") event.text = "v";
}
private function textChangeHandler(event:Event):void
{
trace(textField.text);
}
}
}
com.text.TextField.as
package com.text
{
import flash.events.Event;
import flash.events.TextEvent;
import flash.text.TextField;
public class TextField extends flash.text.TextField
{
private var textEvent:TextEvent;
private var newTextEvent:TextEvent;
public function TextField()
{
super();
this.addEventListener(TextEvent.TEXT_INPUT, textInputHandler, false, 2);
this.addEventListener(TextEvent.TEXT_INPUT, newTextInputHandler);
this.addEventListener(Event.CHANGE, textChangeHandler, false, 1);
}
private function textInputHandler(event:TextEvent):void
{
textEvent = new TextEvent(TextEvent.TEXT_INPUT, false, false, event.text);
}
private function newTextInputHandler(event:TextEvent):void
{
newTextEvent = new TextEvent(TextEvent.TEXT_INPUT, false, false, event.text);
}
private function textChangeHandler(event:Event):void
{
if( textEvent.text == newTextEvent.text ) return;
var newCaretIndex:int = this.caretIndex - ( textEvent.text.length - newTextEvent.text.length );
this.replaceText( caretIndex - textEvent.text.length, caretIndex, newTextEvent.text );
this.setSelection(newCaretIndex, newCaretIndex);
}
}
}