【问题标题】:Flex spark TextArea limit max characters when copy/pastedFlex spark TextArea 限制复制/粘贴时的最大字符数
【发布时间】: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 时它不会发出警报。关于为什么会发生这种情况的任何想法?

标签: apache-flex textarea max flex-spark


【解决方案1】:

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

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

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

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

所以,我的建议是:

  1. 使用更改处理程序是正确的。
  2. 在处理程序中,获取剪贴板中的文本,然后你可以获取剪贴板中文本的长度,用这个长度+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. 
                }
            }
        }

【讨论】:

    猜你喜欢
    • 2012-07-28
    • 1970-01-01
    • 2016-12-16
    • 2012-10-05
    • 2013-10-11
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多