ActionScript 3 отслеживает динамическое изменение текста - PullRequest
0 голосов
/ 18 декабря 2011

Есть ли способ «слушать» динамический текст? У меня есть это динамическое текстовое поле на сцене, и я хочу вызвать функцию после изменения динамического текста. Я пытался добавить прослушиватель событий, но, похоже, он работает только с текстом INPUT. Какие-либо предложения? Спасибо

Ответы [ 4 ]

4 голосов
/ 18 декабря 2011

Хотя ответ @ annonymously работает, прикрепление слушателей enterFrame для ожидания изменения текста (или любого другого изменения) не очень хорошая идея - текст может вообще не измениться, тогда зачем вам много кода запускать раз в секунду, если это можно избежать? Не говоря уже о том, что вам придется делать это снова и снова для каждого нового экземпляра текстового поля, который вы хотите отслеживать.

Лучше реагировать на реальные изменения, и они вызваны вашей собственной настройкой свойств. Вам просто нужно расширить класс TextField и переопределить установщики для htmlText и / или текста, чтобы отправить событие изменения:

override public function set text ( text : String ) : void {
    super.text = text;
    dispatchEvent (new Event (Event.CHANGE);
}
1 голос
/ 18 декабря 2011

Вы можете написать очень простой подкласс, который позволяет прослушивать события изменения текста.

Sublass:

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());
        }
    }
}
0 голосов
/ 18 декабря 2011

Только входящий текст отправляет события CHANGE, как вы сказали.Вам придется обойти это, возможно, так:

var oldText:String = "";

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

addEventListener(Event.ENTER_FRAME, changeEnterFrame);
0 голосов
/ 18 декабря 2011

Вы пробовали событие CHANGE?Он должен работать для всех типов текстовых полей, включая не входные.

...