从文本字段中删除最后一个字符而不破坏textformat

时间:2011-01-03 09:25:22

标签: flex flash actionscript-3

我有一个问题,我想删除包含多个textformats的文本字段(包括换行符)中的最后一个字符而不删除格式。

到目前为止,我有:

textfield.replaceText(textField.length-1,textField.length-1,'');

我想这不会删除换行符,而且非常慢,似乎会破坏我的文本格式。

或:

textfield.text = textfield.text.slice(0,-1);

这个更快但删除了所有的文本格式。

2 个答案:

答案 0 :(得分:1)

我希望我能正确理解你的问题。如果你在htmlText中保留格式,我有一个可能的解决方案:

我们的想法是将格式化文本保持为XML格式,并修改XML。 XML将保持您的格式完整,您不必执行字符串特技飞行来维护它们。缺点当然是必须保持格式化XML有效,以及额外的变量。

以下是一个例子:

var tf:TextField = new TextField();
var t:XML = new XML("<html><p>lalala</p><font color='#ff0000'> lol</font></html>"); 
tf.htmlText = t.toXMLString();
t.font[0] = t.font[0].text().slice(0, -1);
tf.htmlText = t.toXMLString();
addChild(tf);

答案 1 :(得分:1)

这有点单调乏味,但您可以使用TextField的htmlText - 属性,即使您没有使用StyleSheets格式化文本:Flash会在内部将所有格​​式信息转换为HTML文本,因此即使设置textField.text后,您仍然可以使用xml格式的文本:

textField.text = "A test.";
trace (textField.htmlText);

实际上将返回:

<P ALIGN="LEFT"><FONT FACE="Times Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">A test.</FONT></P>

文字将始终显示在<FONT>标记内,反映您使用setTextFormat()所做的更改。因此,您可以迭代此行中包含的XML,并仅删除最后一个TextNode中的最后一个字符:

private function removeLastCharacter (textField:TextField) : void {
    var xml:XML = new XML (textField.htmlText);
    for ( var i : int = xml.children().length()-1; i >= 0; i-- ){
        var node:XML = xml.children()[i];
        if ( node.name() == "FONT") {
            var tx:String = node.text()[0].toString();
            node.setChildren (tx.substr (0, tx.length-1));
            break;
        }
    }
    textField.htmlText = xml; 
    trace (textField.text); // In the above example, output will be: "A test";
}