关于flex中RichTextEditor控件,监听Ctrl+s事件和去除Ctrl+s按下时在RichTextEditor生成的不可知字符的问题

欧阳洲
2023-12-01

本文主要是记录作者当时解决此问题的过程,欢迎大家指正

 

问题描述:

 

使用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生成的不可知字符的问题。

 类似资料: