本文主要是记录作者当时解决此问题的过程,欢迎大家指正
问题描述:
使用RichTextEditor来作为文本的编辑区,此编辑区要监听键盘的ctrl+s事件,同时不想让ctrl+s产生的不可知字符出现在RichTextEditor的文本编辑区内。
解决办法:
1、对于RichTextEditor控件,此控件其实就是对textarea控件的封装,在textarea上再加上一些控制控件,如combox控件等。当时考虑,对于想屏蔽ctrl+s产生的字符,可以监听RichTextEditor的textinput事件,然后在处理此事件的方法内当检测到为ctrl+s时,调用e.preventDefault(),进而实现对此进行屏蔽。结果对RichTextEditor控件监听textinput方法时,此事件不会被触发。
2、考虑到此textinput事件应该被flash.text.textfield类型的控件监听到的,就是单独的使用textarea控件,然后监听textinput,此事件被成功检测到,此时就想到是否是因为RichTextEditor控件的问题。
3、查看RichTextEditor控件的源码核心部分如下:
<mx:TextArea id="textArea" height="100%" width="100%" minHeight="0" minWidth="0"
change="dispatchEvent(event);"
valueCommit="dispatchEvent(event);"
keyUp="getTextStyles()"
keyDown="if (textFormatChanged)
{
textArea.getTextField().defaultTextFormat=previousTextFormat;
textFormatChanged = false;
}"
mouseDown="systemManager.addEventListener(
MouseEvent.MOUSE_UP, systemManager_mouseUpHandler, true);"
/>
<mx:ControlBar>
<!--- @private -->
<mx:ToolBar id="toolbar" width="100%" horizontalGap="7">
<mx:ComboBox id="fontFamilyCombo" editable="true"
creationComplete="getTextStyles();lastCaretIndex = -1;"
dataProvider = "{fontFamilyArray}"
close="setTextStyles('font');"
enter="setTextStyles('font');"/>
从这里可以看到为什么在外层检测不到textinput事件了,textArea根本没有广播此事件外层也就无法检测到了!当时想到了重载此控件进行重写,结果失败,具体谁有什么好的方法可以告知我一下,我使用另一种方法如下,对此RichTextEditor控件进行重写,直接定义了一个新的控件MYRichTextEditor,内容和RichTextEditor完全相同,然后修改我需要修改的地方。对此控件添加textinput事件广播,textinput="dispatchEvent(event);"结果在调用此MYRichTextEditor控件的容器内虽然检测到此事件,但是e.preventDefault()不产生任何作用,此处不清楚为什么。
所以就把监听和处理的方法全部放到MYRichTextEditor控件内部来实现。
重写的核心部分如下:
<mx:TextArea id="textArea" height="100%" width="100%" minHeight="0" minWidth="0"
change="dispatchEvent(event);"
valueCommit="dispatchEvent(event);"
keyUp="getTextStyles(),keyUpexec(event)"
textInput="changeTextContent(event)"
keyDown="execKeyBorad(event)"
mouseDown="systemManager.addEventListener(
MouseEvent.MOUSE_UP, systemManager_mouseUpHandler, true);"
/>
因为我要在调用MYRichTextEditor控件的容器内,进行文件的保存操作,此保存MYRichTextEditor的text的方法是在MYRichTextEditor控件的父容器内(如下:
/**
* 保存文件函数
* */
private function saveSqlFileFunc():void
{
for(var temp:int = 0;temp<this.arraysqlfile.length;temp++)
{
var object:Object = arraysqlfile.getItemAt(temp) as Object;
if(object.count == this.sqlTextArea.sqlcount)
{
var filename:String = new String();
filename = object.filepath as String;
if(filename == "null")
{
var file:File = new File();
file.browseForSave("保存文件");
file.addEventListener(Event.SELECT,onSelectSqlFile);//选择要保存的文件后单击保存触发的动作
}
else
{
var filew:InitMenuItem = new InitMenuItem();
filew.writeFile(sqlTextArea.text,object.filepath as String);
Alert.show("文件保存成功!","对话框",4,this);
}
}
}
}
(而且此方法不仅有ctrl+s控件触发,在选择菜单中的保存子菜单时也要调用此方法),也就是说我在MYRichTextEditor控件内监听到ctrl+s事件时,同时要通知它的父容器。可能有别的实现方式,我选择在此定义一个自定义事件,在MYRichTextEditor内部监听到ctrl+s事件时,同时广播我的自定义事件,让调用MYRichTextEditor控件的父容器中可以监听到我定义的自定义事件。
在MYRichTextEditor中广播事件DetailCavEvent
/**
* 对于ctrl+S键,不进行输入操作
* */
public function changeTextContent(e:TextEvent):void
{
if(ctrl_key_s)
{
ctrl_key_s = false;
ctrl_key = false;
e.preventDefault();//消除ctrl+s键产生的字符
dispatchEvent(new DetailCavEvent("filesave","CHMEVENT"));
}
}
在父容器中:注册监听事件,
Private function init():void
{
sqlTextArea.addEventListener("CHMEVENT",saveSqlFile);
}
/**
* 监听保存ctrl+s事件
* */
private function saveSqlFile(event:DetailCavEvent):void
{
saveSqlFileFunc();
}
从而实现了监听Ctrl+s事件和去除Ctrl+s按下时在RichTextEditor生成的不可知字符的问题。