【发布时间】:2011-12-18 09:32:13
【问题描述】:
有没有办法“收听”动态文本?我在舞台上有这个动态文本字段,我想在动态文本更改后调用一个函数。我试图添加事件侦听器,但它似乎只适用于 INPUT 文本。有什么建议么? 谢谢
【问题讨论】:
标签: actionscript-3 actionscript dynamic-text
有没有办法“收听”动态文本?我在舞台上有这个动态文本字段,我想在动态文本更改后调用一个函数。我试图添加事件侦听器,但它似乎只适用于 INPUT 文本。有什么建议么? 谢谢
【问题讨论】:
标签: actionscript-3 actionscript dynamic-text
虽然@annonymously 的答案有效,但附加 enterFrame 侦听器以等待文本更改(或任何更改,就此而言)并不是一个好主意 - 文本可能根本不会更改,那你为什么要多次运行一段代码每秒次数,如果可以避免的话?更不用说您必须一遍又一遍地为要监控的每个新文本字段实例执行此操作。
最好对实际变化做出反应,这些变化是由您自己的属性设置引起的。您应该简单地扩展 TextField 类并覆盖 htmlText 和/或 text 的设置器以调度更改事件:
override public function set text ( text : String ) : void {
super.text = text;
dispatchEvent (new Event (Event.CHANGE);
}
【讨论】:
您可以编写非常简单的子类,让您可以监听文本更改事件。
子类:
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());
}
}
}
【讨论】:
您尝试过CHANGE 事件吗?它应该适用于所有类型的文本字段,包括非输入字段。
【讨论】:
如您所说,只有输入文本才会调度 CHANGE 事件。你必须解决它,也许像这样:
var oldText:String = "";
function changeEnterFrame (e:Event) {
if (oldText != textField.text) {
// Do your stuff here
}
oldText = textField.text;
}
addEventListener(Event.ENTER_FRAME, changeEnterFrame);
【讨论】: