0

有没有办法“听”动态文本?我在舞台上有这个动态文本字段,我想在动态文本更改后调用一个函数。我试图添加事件侦听器,但它似乎只适用于 INPUT 文本。有什么建议么?谢谢

4

4 回答 4

4

虽然@annonymously 的答案有效,但附加 enterFrame 侦听器以等待文本更改(或任何更改,就此而言)并不是一个好主意 - 文本可能根本不会改变,那么为什么你要每秒运行一段代码多次,是否可以避免?更不用说这样一个事实,即您必须一遍又一遍地为要监视的每个新文本字段实例执行此操作。

最好对实际更改做出反应,这些是由您自己的属性设置引起的。您应该简单地扩展 TextField 类并覆盖 htmlText 和/或 text 的设置器以调度更改事件:

override public function set text ( text : String ) : void {
    super.text = text;
    dispatchEvent (new Event (Event.CHANGE);
}
于 2011-12-18T10:09:49.660 回答
1

您可以编写非常简单的子类,它允许您监听文本更改事件。

次类:

package
{
    import flash.events.Event;
    import flash.text.TextField;

    public class CustomTextField extends TextField
    {
        public function CustomTextField()
        {
            super();
        }

        override public function set text( value:String ):void
        {
            if( super.text != value )
            {
                super.text = value;
                dispatchEvent(new Event(Event.CHANGE, true));
            }
        }
    }
}

使用示例:

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;

    public class CustomTextFieldTest extends Sprite
    {
        private var tf:CustomTextField;

        public function CustomTextFieldTest()
        {
            tf = new CustomTextField();

            tf.x = tf.y = 10;
            tf.width = tf.height = 200;

            tf.addEventListener(Event.CHANGE, onTfChange);
            addChild(tf);

            stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
        }

        private function onTfChange( e:Event ):void {
            trace("text changed, new text: '" + tf.text + "'");
        }

        private function onMouseDown( e:MouseEvent ):void {
            tf.text = "some random text: " + Math.round(100 * Math.random());
        }
    }
}
于 2011-12-18T10:14:04.630 回答
0

你试过这个CHANGE活动吗?它应该适用于所有类型的文本字段,包括非输入字段。

于 2011-12-18T09:56:55.887 回答
0

正如您所说,只有输入文本才会调度 CHANGE 事件。你必须解决它,也许像这样:

var oldText:String = "";

function changeEnterFrame (e:Event) {
    if (oldText != textField.text) {
        // Do your stuff here
    }
    oldText = textField.text;
}

addEventListener(Event.ENTER_FRAME, changeEnterFrame);
于 2011-12-18T09:57:03.170 回答