Flex spark TextArea 限制复制/粘贴时的最大字符数

Posted

技术标签:

【中文标题】Flex spark TextArea 限制复制/粘贴时的最大字符数【英文标题】:Flex spark TextArea limit max characters when copy/pasted 【发布时间】:2012-10-16 01:56:55 【问题描述】:

我进行了搜索,但无法找到它。我们有一个 maxChars="3900" 的 Spark TextArea。但是当复制/粘贴到文本区域时它不起作用。我试图将它添加到正在改变的处理程序中:

 if (ta.text.length > 3900)
        
                        Alert.show("The maximum characters length is 3900. Please limit the characters to the max limit");
                        ta.text = ta.text.substr(0, 3900);
                     else 
                    
                        if (event.operation is PasteOperation)
                        
....//Other logic
                        
       

问题是它并不总是有效。警报仅在超过 3900 个字符时才会显示。不知道为什么。我也将相同的内容添加到 changeHandler 中。但这根本不会被触发。

请告诉我我错过了什么。每次超过最大限制时,我都需要显示警报并将字符修剪到最大值。

谢谢

哈里什

【问题讨论】:

它不工作怎么办?您是否收到错误消息?或意外行为?请提供详细信息。 我有一个文本计数为 1600 的 word 文档。我复制/粘贴了 3 次,但没有触发警报。然后,当我尝试复制 textArea 中的文本时,它决定显示警报并修剪文本!奇怪! 我仍然不清楚问题是什么。听起来一切都如您所愿? 在您的处理程序方法中,在 if 块之前,尝试跟踪您的文本字符串长度。 @DavidLiGuoliang 我试过了。我认为问题是当我第一次粘贴一块 1600 个字符时,它显示 textArea.length = 0。当我第二次粘贴相同的块时,现在它显示为长度 = 1600(实际上是 3200)。所以这就是为什么当大小 > 3900 时它不会发出警报。关于为什么会发生这种情况的任何想法? 【参考方案1】:

首先,我们需要明确一件事:当更改处理程序被触发时,这意味着:文本正在更改,但更改尚未应用。

如果你的 textare 中的文本是“”(空),现在,我粘贴 1600 个字符,调用更改处理程序,文本的长度仍然为 0,因为它正在更改,而不是更改。

所以现在,如果你有一个更改处理程序,当你跟踪长度时,它应该是 1600。

但是,如果你使用“event.preventDefault();”在您的更改方法中,并且不更改更改处理程序中的文本,则不应触发更改处理程序。

所以,我的建议是:

    使用更改处理程序是正确的。 在处理程序中,获取剪贴板中的文本,然后你可以获取剪贴板中文本的长度,用这个长度+textArea.text.length,你会得到长度,如果粘贴处理。 如果总长度大于您的限制,您可以阻止该事件,并做任何您想做的事情。

这里有一些代码:

protected function textArea_changingHandler(event:TextOperationEvent):void
        
            trace(event.type + " - " + textArea.text.length); //  this length is befor the paste

            if(event.operation is PasteOperation) 
                // Text in the clipboard.
                var textPaste:String = Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT) == null ? "" : Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT) as String; 
                // this length is after the paste(if the paste will complete)
                var totalLength:int = textArea.text.length + textPaste.length; 
                trace("String length after Paste: " + totalLength);

                if(totalLength > 3900) 
                    event.preventDefault();
                    textArea.text += "[Paste:" + textPaste.substr(0, 2) + "]"; // process your text here. 
                
            
        

【讨论】:

以上是关于Flex spark TextArea 限制复制/粘贴时的最大字符数的主要内容,如果未能解决你的问题,请参考以下文章

添加新行时,如何以编程方式滚动到 Flex Spark Textarea 的末尾?

Flex ApplyFormatOperation 中断 Spark TextArea 中的撤消/重做

如何在 Flex/Spark TextArea 或 TextFlow 中的特定位置添加图像

Flex 限制 textarea 中的字符数

将文本长度限制为 flex 3 中的 mx textarea 可用大小

Flex - 使用 CSS 样式化 TextArea