参考:AS3及Flex的常用实用问题

作者:网络 来源:佚名 更新时间:2009-01-18 12:11:22 点击:

找资料的时候看到一篇文章很实用对新手的基本问题都可以找到,方便查找答案的时间

【改变输出swf的尺度,背景颜色或帧频】
在"navigator"窗框里右键你的项目>选中"properties">选中"actionscript compiler">在"additional compiler arguments"里输入你所需要的命令
如想改变背景颜色,请输入: -default-background-color 0xffffff


【鼠标坐标】
mousex mousey

【检查变量类型并返回布尔值】
is

【检查变量类型并返回类型】
typeof

【检查对象类型并返回该对象】
as

【是数字但不是有效数字问题】
var quantity:number = 15 - "rabbits";
trace(typeof quantity); //显示: "number" , 但它是nan (not a number)
trace(quantity is number); //true
trace(quantity != nan); //false
//使用isnan()函数检测:
isnan(quantity); //true
//检测变量是否内含有效数字:
!isnan(quantity); //false

【取消默认的严格编译模式】
在"navigator"窗框里右键你的项目>选中"properties">选中"actionscript compiler">取消"enabel compile-time type checking"选项

【基元数据类型和复杂数据类型好比"值类型"和"引用类型"】
基元数据类型类似按值传递:
var intone:int = 1;
var inttwo:int = 1;
trace(intone == inttwo); //true

【复杂数据类型类似按引用传递】
var arrayone:array = new array("a", "b");
var arraytwo:array = arrayone;
trace(arrayone == arraytwo); //true
//-----------------------------------
var arrayone:array = new array("a", "b");
var arraytwo:array = new array("a", "b");
trace(arrayone == arraytwo); //false

【优化逻辑and(&&)和or(||)的小知识】
对于逻辑and(&&):
     除非条件表达式的前半部分为真,否则,actionscript不会再去求算逻辑and运算符的后半部.如果前半部为假,整个条件表达式一定为假,所以再去求算后半部就没效率了.
对于逻辑or(||):
     除非条件表达式前半部为假,否则,actionscript不会再去求算逻辑or运算符的后半部,如果前半部为真,整个条件表达式一定为真.
总结:使用逻辑and(&&)时,把结果最可能为false的表达式放到前面;使用逻辑or(||)时,把结果最可能为true的表达式放到前面.

【timer类注意事项】
不要认为timer可以极其准确;使用timer时间间隔不要低于10毫秒.

【private,protected,internal,public访问权限】
private:只能在类本身内部访问,按惯例,命名私有成员时以下划线"_"开头;
protected:可以由类本身或任何子类访问.但这是以实例为基础的.换言之,类实例可以访问自己的保护成员或者父类的保护成员,但不能访问相同类的其它实例的保护成员,按惯例,命名保护成员时以下划线"_"开头;
internal:可以由类本身或者相同包内的任何类访问;
public:可以在类内部访问,也可以由类实例访问,或者声明为static时,可以直接从类访问.

【一个函数具有未知个数的参数,用arguments对象或"...(rest)"符号访问它的参数】
注意:使用"...(rest)"参数会使 arguments 对象不可用;
private funciton average():void{
     trace(arguments.length); //输出参数的个数
     // arguments的类型是:object,但可以像访问数组一样去访问它
     trace(arguments[1]); //输出第二个参数
}
private function average(...argu):void{
     trace(argu[1]); //输出第二个参数,argu参数名是自定义的.
}

【错误处理try,catch,finally】
private function tryerror():void{
     try {
         trace("测试开始-try");
         throwerror();
     }catch(errobject:error) {
         trace("错误信息:" + errobject.message);
         trace("测试结束-catch");
         return;
     }finally{
         trace("虽然catch里已经有return方法,但位于return方法后面的finally里的代码依然会被执行.其实无论return方法是在try里,还是catch里,finally里的代码始终会被执行");
     }
     trace("前面已经有return了,此处是不会再执行的.除非没有抛出错误,以使catch里的代码没有被执行");
}
private function throwerror():void{
     throw new error("抛出错误");
}

【for...in与for each...in的区别】
与for...in循环不同的是,for each...in循环中的迭代变量包含属性所保存的值,而不包含属性的名称(或主键,索引).

【命名包路径的小技巧】
     使用相应于拥有者和相关项目的包名称会比较好.按惯例来讲,包名称的开头应该是逆向的网址名称.例如,如果example corp(examplecorp.com)写了一些actionscript3.0类,就会把所有类放在com.examplecorp包内(或者 com.examplecorp的子包内).如此一来,如果英国有另一家example corp(examplecorp.co.uk)也写了一些actionscript3.0类,只要使用包uk.co.examplecorp,就可确保 唯一性.
     当类属于特定应用程序的一部分时,就应该放在该应用程序特定的子包内.例如,example corp可能有个应用程序名叫widgetstore.如果widgetstore应用程序使用一个名为applicationmanager的类,则此 类就应该放在com.examplecorp.widgetstore包内,或者位于该包的子包内.
     按惯例来说,包名称的开头是小写字母.

【隐式的取出方法(getter)和设定方法(setter)】
public function get count():uint {
     return _count;
}
public function set count(value:uint):uint {
     if(value < 100){
         _count = value;
     }else {
         throw error();
     }
}

【确保类是绝不会有子类,使用final】
final public class example{}

【super关键字的使用】
super(); //父类的构造函数,只能在类实例构造函数内部使用
super.propertyname; //调用父类的属性,属性需要声明为public或protected
super.methodname(); //调用父类的方法,方法需要声明为public或protected

【建立常数,使用关键字const而不是var】
static public const example:string = "example";

【检测播放器版本】
flash.system.capabilities.version
对于8.5版以前的任何flash player版本,这种方法都不适用.

【判断客户端系统】
flash.system.capabilities.os

【检测播放器类型】
flash.system.capabilities.playertype
可能的值有:
"standalone",用于独立的 flash player
"external",用于外部的 flash player 或处于测试模式下
"plugin",用于 flash player 浏览器插件
"activex",用于 microsoft internet explorer 使用的 flash player activex 控件

【检测系统语言】
flash.system.capabilities.language

【判断用户是否启用了ime(输入法编辑器)】
flash.system.ime.enabled

【检测屏幕的分辨率】
flash.system.capabilities.screenresolutionx
flash.system.capabilities.screenresolutiony

【把弹出窗口居中的算法】
x = (舞台宽/2)-(窗口宽/2)
y = (舞台高/2)-(窗口高/2)

【控制影片配合player的方式,包括缩放问题】
stage.scalemode
可供选择值:flash.display.stagescalemode

【舞台的对齐方式】
stage.align
可供选择值:flash.display.stagealign

【隐藏flash player的右键菜单】
stage.showdefaultcontextmenu = false;

【检测系统是否具有音频功能】
flash.system.capabilities.hasaudio

【检测播放器是在具有mp3解码器的系统上运行,还是在没有mp3解码器的系统上运行】
flash.system.capabilities.hasmp3

【检测播放器能 (true) 还是不能 (false) 播放流式视频】
flash.system.capabilities.hasstreamingvideo

【检测播放器是在支持 (true) 嵌入视频的系统上运行,还是在不支持 (false) 嵌入视频的系统上运行】
flash.system.capabilities.hasembeddedvideo

【检测播放器能 (true) 还是不能 (false) 对视频流(如来自 web 摄像头的视频流)进行编码】
flash.system.capabilities.hasvideoencoder

【显示 flash player 中的"安全设置"面板】
flash.system.security.showsettings();
可供选择项:flash.system.securitypanel

【让其它域的.swf访问本域的.swf】
在本域的.swf文件里加上:flash.system.security.allowdomain()
或 者使用安全策略文件"crossdomain.xml".在flash 8以前,这个文件必须放在.swf所在域的根目录,现在,你可以使用flash.system.security.loadpolicyfile(),指 定安全策略文件所在的位置.拒绝任何域的做法是在<cross-domain-policy>标签内什么也不填,安全策略文件也支持通用字符 "*":
<?xml version="1.0"?>
<!-- http://www.mydomain.com/crossdomain.xml -->
<cross-domain-policy>
     <allow-access-from domain="www.webjx.com" />
     <allow-access-from domain="*.y-boy.cn" />
     <allow-access-from domain="210.38.196.48" />
     <allow-access-from domain="*" />
</cross-domain-policy>

【数字的不同进制之间的转换】
parseint(str:string, radix:uint = 0):number 返回十进制的数,参数radix表示要分析的数字的基数.如果省略radix,就默认为10,除非字符串的开头是"0x","0x"或"0":
trace(parseint("0x12")); //设定radix为16,输出:18
trace(parseint("017")); //设定radix为8,输出:15
或者使用number,uint和int对象的tostring(radix)方法.

【使用math.round()对一个数取整,四舍五入】
math.round()
trace(math.round(204.499)); //输出:204
trace(math.round(401.5)); //输出:402

【使用math.floor()对一个数向下取整,就是只要整数部分而不理会小数分】
trace(math.floor(204.99)); //输出:204

【使用math.ceil()对一个数向上取整,只要小数部分不为零,整数部分就加1】
trace(math.ceil(401.01)); //输出:402

【产生一个随机数】
使用math.random()产生一个伪随机数n,其中 0 <= n < 1

【把数字取至最近的小数点位,即指定精确度】
1. 决定你要取的数字的小数点位数:例如,如果你想把90.337取成90.34,就表示你要取到两位小数点位,也就是说你想取至最近的0.01;
2. 让输入值除以步骤1所选的数字(此例为0.01);
3. 使用math.round()把步骤2所计得的值取成最近的整数;
4. 把步骤3所得的结果乘以步骤2用于除法的那个值.
例如,要把90.337取成两个小数点位数,可以使用:
trace(math.round(90.337/0.01)*0.01); //输出:90.34

【把数字取成一个整数的最接近倍数值】
例1,这样会把92.5取成5的最近倍数值:
trace(math.round(92.5/5)*5); //输出:95
例2,这样会把92.5取成10的最近倍数值:
trace(math.round(92.5/10)*10); //输出:90

【在指定数值范围内获得随机数】
//可取范围:[min, max]
private function randrange(min:number, max:number):number {
     var randomnum:number = math.floor(math.random() * (max - min + 1)) + min;
     return randomnum;
}
应用例子:
模拟投银币,即希望得到随机布尔值(true 或 false): randrange(0, 1);
模拟投骰子,即希望得到随机六个值: randrange(1, 6);
为避免被缓存而需要产生一个独一无二的数字追加在url尾端,通常最佳方法是取得当前毫秒数.

【弧度(radian)与度数(degree)之间的转换】
从弧度转为度数: degrees = radians * 180 / math.pi
从度数转为弧度: radians = degrees * math.pi / 180

【计算两点之间的距离】
勾股定理: c2 = a2 + b2
假设有两个影片剪辑mc1和mc2,则它们两点间的距离c为:
var c:number = math.sqrt(math.pow(mc1.x - mc2.x, 2) + math.pow(mc1.y - mc2.y, 2));

【模拟圆周运动】
已知圆心o(x0, y0),半径r和弧度angle,求圆上任意一点p(x, y)的坐标:
x = x0 + (math.cos(angle) * r);
y = y0 + (math.sin(angle) * r);
注意:舞台的x轴正方向水平向右,y轴正方向垂直向下.

【模拟椭圆运动】
已知圆心o(x0, y0),长轴a,短轴b以及弧度angle,求圆上任意一点p(x, y)的坐标:
x = x0 + (math.cos(angle) * a);
y = y0 + (math.sin(angle) * b);


【华氏温度和摄氏温度之间的转换】
华氏温度 = 摄氏度数 * 9 / 5 + 32
摄氏温度 = (华氏度数 - 32) * 5 /9

【公斤与磅之间的转换】
公斤 = 磅 * 2.2
磅 = 公斤 / 2.2

【向数组尾端添加元素】
var array:array = new array();
array.push("a", "b");
//向数组尾端添加单一元素也可以这样:
array[array.length] = "c";
//如果以索引设定的元素不存在,数组本身会自动扩展以包含足够的元素数目.介于中间的元素会被设为undefined:
array[5] = "e";
trace(array[4]); //输出: undefined

【向数组开端添加元素】
var array:array = ["a", "b"];
array.unshift("c", "d");
trace(array); //输出: c,d,a,b

【删除数组中第一个元素并返回该元素,使用shift()方法】
var letters:array = new array("a", "b", "c");
var firstletter:string = letters.shift();
trace(letters); //输出: b,c
trace(firstletter); //输出: a

【删除数组中最后一个元素并返回该元素的值,使用pop()方法】
var letters:array = new array("a", "b", "c");
trace(letters); //输出: a,b,c
var letter:string = letters.pop();
trace(letters); //输出: a,b
trace(letter); //输出: c

【删除数组中的元素,给数组添加新元素并返回删除的元素,使用splice()方法】
splice(startindex:int, deletecount:uint, ... values):array
startindex: 一个整数,它指定数组中开始进行插入或删除的位置处的元素的索引;
deletecount: 一个整数,它指定要删除的元素数量;
... values: 用逗号分隔的一个或多个值的可选列表或数组,此列表或数组将插入到此数组中由 startindex 参数指定的位置.

【查找数组中第一个相匹配的元素】
var array:array = ["a", "b", "c", "d", "a", "b", "c", "d"];
var match:string = "b";
for(var i:int = 0; i < array.length; i++) {
     if(array[i] == match) {
         trace("element with index " + i + " found to match " + match);
         //输出: element with index 1 found to match b
         break;
     }
}

【查找数组中最后一个相匹配的元素】
var array:array = ["a", "b", "c", "d", "a", "b", "c", "d"];
var match:string = "b";
for(var i:int = array.length - 1; i >= 0; i--) {
     if(array[i] == match) {
         trace("element with index " + i + " found to match " + match);
         //输出: element with index 5 found to match b
         break;
     }
}

【把字符串转成数组】
使用string.split()方法:
var list:string = "i am youngboy.";
var words:array = list.split(" "); //以空格作为分隔符将字符串切割
trace(words); //输出: i,am,youngboy.

【把数组转成字符串】
使用string.join()方法:
var myarr:array = new array("one", "two", "three");
var mystr:string = myarr.join(" and ");
trace(myarr); //输出: one,two,three
trace(mystr); //输出: one and two and three

【使用对象数组处理相关数据】
var cars:array = new array();
cars.push({make:"mike", year:1997, color:"blue"});
cars.push({make:"kelly", year:1986, color:"red"});
for(var i:int = 0; i < cars.length; i++) {
     trace(cars[i].make + " - " + cars[i].year + " - " + cars[i].color);
}
//输出:
//     mike - 1997 - blue
//     kelly - 1986 - red

【在数组中获取最小或最大值】
var scores:array = [10, 4, 15, 8];
scores.sort(array.numeric);
trace("minimum: " + scores[0]);
trace("maximum: " + scores[scores.length - 1]);

【使用for ... in语句读取关联数组元素】
var myobject:object = new object();
myobject.name = "youngboy";
myobject.age = 20;
for(var i:string in myobject) {
     trace(i + ": " + myobject[i]);
}
//输出: name: youngboy
//       age: 20
注意: for ... in循环不会显示对象所有的内建属性.例如,循环会显示执行期间新增的特殊属性,但是,不会列出内建对象的方法,即使都是储存在对象属性内.

【avm(actionscript virtual machine,虚拟机)和渲染引擎(rendering engine)】
avm负责执行actionscript程序,而渲染引擎则是把对象绘制在显示器上.

【指出容器的显示清单中有多少显示对象】
每个容器都有numchildren属性.

【把项目新增至显示清单】
addchild(child:displayobject)
addchildat(child:displayobject, index:int)
index: 添加该子项的索引位置.如果指定当前占用的索引位置,则该位置以及所有更高位置上的子对象会在子级列表中上移一个位置.

【从显示清单中移除项目】
removechild(child:displayobject)
removechildat(index:int)
index: 要删除的 displayobject 的子索引,该子项之上的任何显示对象的索引位置都减去1.
如果想移除窗口所有子元件,可以结合removechildat(),numchildren属性以及for循环.因为每次一个子元件被移除时,索引位置都会变化,所以,有两种方法可以处理所有子元件的移除:
1. 总是移除位置0的子元件;
2. 倒过来移除子元件,也就是从尾端开始.

【更改现有子项在显示对象容器中的位置】
setchildindex(child:displayobject, index:int):void
可能用到的方法:
返回 displayobject 的 child 实例的索引位置: getchildindex(child:displayobject):int
返回位于指定索引处的子显示对象实例: getchildat(index:int):displayobject
注 意: 当子元件移到低于它现在所在位置的索引时,那么,从标的索引起,直到子元件索引前面的那个索引的所有子元件都会令其索引增加1,而该子元件就会指定至标的 索引.当子元件移到较高索引时,从该子元件索引之上的那个索引起,直到标的索引的所有子元件都会令其索引往下减1,而该子元件就会指定至标的索引值.

【关于textfield以垂直方式把文字摆在按钮表面中心点的小技巧】
textfield.y = (_height - textfield.textheight) / 2;
textfield.y -= 2; //减2个像素以调整偏移量

【外部.swf影片载入和互动】
1. 监听init事件;
2. 透过content属性存取所载入的影片.
当所载入的影片做好足够的初始化工作,使其方法和属性可以接受互动时,init事件就会被发起.只有在载入器发起init事件后,才能控制影片.所载入的影片还没初始化就试着与它互动,是会产生执行期间错误的.
_loader.contentloaderinfo.addeventlistener(event.init, handleinit); //当载入的.swf的属性和方法可用时
_loader.load(new urlrequest("externalmovie.swf"));
private function handleinit(event:event):void {
     var movie:* = _loader.content;
     trace(movie.getcolor());
     movie.setcolor(0xff0000);
}

【textfield有两种类型:动态(dynamic)和输入(input),默认值为动态.改变textfield类型方法】
field.type = textfieldtype.input; //selectable属性默认值为true
flash.text.textfieldtype.input和flash.text.textfieldtype.dynamic

【过滤文字输入】
textfield.restrict = "此处为可输入的内容";
field.restrict = "^此处为禁止输入的内容";
restrict属性支持一些类似正则表达式的样式:
field.restrict = "a-za-z"; //只允许大小字母
field.restrict = "a-za-z "; //只允许字母和空格
field.restrict = "0-9"; //只允许数字
field.restrict = "^abcdefg"; //除了小写字母abcdefg不允许外,其它都允许
field.restrict = "^a-z"; //所有小写字母都不允许,但是,其它内容都允许,包括大写字母
field.restrict = "0-9^5"; //只允许数字,但5例外
让restrict字符包含具有特殊意义的字母(例如-和^):
field.restrict = "0-9\\-"; //允许数字和破折号
field.restrict = "0-9\\^"; //允许数字和^
field.restrict = "0-9\\\\"; //允许数字和反斜杠
你也可以使用unicode转义序列,指定允许的内容.例如:
field.restrict = "^\u001a";
注意:actionscript有区分大小写的,如果restrict属性设为abc,允许字母的大写形式(a,b和c)输入时会变成小写对待形式(a,b和c),反之亦然.restrict属性只影响用户可以输入的内容,脚本可将任何文本放入文本字段中.

【设定输入框的最大长度】
textfield.maxchars:int

【向textfield追加内容】
textfield.appendtext(text:string):void
与通过对 text 属性使用加法赋值来连接两个字符串(例如 field.text += moretext)相比,此方法的效率更高.

【显示html格式的文字】
textfield.htmltext = "<b>html text</b>";
支 持的html标签集有: <b>,<i>,<u>,<font>(有face,size以及color属性),< p>,<br>,<a>,<li>,<img>以及<textformat>(有 leftmargin,rightmargin,blockindent,indent,leading以及tabstops属性,相应于 textformat类的同名属性)

【缩减空白】
textfield.condensewhite = true;
删除具有html文本的文本字段中的额外空白(空格,换行符等),如同多数html浏览器所做的那样.
注意: 在设置 htmltext 属性之前设置 condensewhite 属性

【自动大小调整和对齐】
textfield.autosize = textfieldautosize.left;
可选之值:
flash.text.textfieldautosize.center
flash.text.textfieldautosize.left
flash.text.textfieldautosize.none
flash.text.textfieldautosize.right

【指示文本字段是否自动换行】
textfield.wordwrap = true; //自动换行

【用程序手段滚动文字】
水平方向以像素为单位,而垂直方向以行做单位:
scrollv: 指出文字框可见区域的最顶行,可读写;
bottomscrollv: 指出文字框内最底端可见行,只读;
maxscrollv: scrollv的最大值,只读;
numlines: 定义多行文本字段中的文本行数,只读;
textfield.scrollv = field.maxscrollv; //滚动到最后一页

【响应滚动事件】
field.addeventlistener(event.scroll, ontextscroll);

【样式化文字的方法】
1. 使用html标签进行样式化;
2. 使用textformat对象;
3. 使用css.
例如: html是用<font>标签,textformat对象是设定font属性,而css是使用font-family属性的.
受支持的层叠样式表(css)属性和值,及其相应的actionscript属性名称(小括号内):
color(color),display(display),font-family(fontfamily),font-size(fontsize),font-style(fontstyle),font-weight(fontweight),kerning(kerning),leading(leading),letter-spacing(letterspacing),margin-left(marginleft),margin-right(marginright),text-align(textalign),text-decoration(textdecoration),text-indent(textindent)
受支持的html实体: <(小于号: <), >(大于号: >), &(和: &), "(双引号: "), '(撇号,单引号: ')
其中样式对象的两种写法:
写法一:
var samplestyle:object = new object();
samplestyle.color = "#ffffff";
samplestyle.textalign = "center";
css.setstyle(".sample", samplestyle);
写法二:
var samplestyle:object = {color: "#ffffff", textalign: "center"};
css.setstyle(".sample", samplestyle);

【对用户输入的文字进行样式化】
使用defaulttextformat属性,样式会施加至用户键入输入框的文字身上:
var formatter:textformat = new textformat();
formatter.color = 0x0000ff; //把文字变成蓝色
field.defaulttextformat = formatter;

【对现有文字的一部分进行样式化】
textformat.settextformat(format:textformat, beginindex:int = -1, endindex:int = -1):void

【设定文字框的字体】
例子:
html: field.htmltext = "<font face='arial'>formatted text</font>";
textformat: formatter.font = "arial";
css: p{ font-family: arial; }
也可以使用以逗号隔开的字体清单: formatter.font = "arial, verdana, helvetica";
注意:
字体和字体群组不同.字体群组有三种: _sans,_serif以及_typewriter.
_sans群组一般就是指arial或helvetica这种字体;
_serif群组一般就是指times或times new roman这种字体;
_typewriter群组一般就是指courier或courier new这种字体.

【嵌入字体】
使用[embed]后设标签.[embed]后设标签应该出现在actionscript文件中,处于类宣告之外.你可以内嵌truetype字体或系统字体.内嵌truetype字体时的语法:
[embed(source="pathtottffile", fontname="fontname", mimetype="application/x-font-truetype")]
pathtottffile: ttf文件的路径,truetype字体的路径可以是相对的,也可以是绝对的;
fontname: 字体名称;
内嵌系统字体的语法:
[embed(systemfont="times new roman", fontname="times new roman", mimetype="application/x-font-truetype")]
fontname: 以相同名称作为实际系统字体名称.
注 意: 在使用嵌入字体时,要把textfield的embedfonts属性设为true,这样textfield只能用内嵌字体了.如果你试着替 embedfonts设为true的textfield使用设备字体,什么都不会显示.如果embedfonts设为true,就无法指定以逗号相隔的字 体清单.

【建立可以旋转的文字】
使用内嵌字体.当你旋转文字框时,设备字体就会消失.

【显示unicode文字】
1. 从外部来源载入unicode文字;
2. 假如你的编辑器支持unicode(如 flex builder),则可以直接在actionscript程序中使用该字符;
3. 使用unicode转义字符,actionscript里所有unicode转义字符都以\u开头,后面再跟四位十六进制数字.
注意: 如果你想取得unicode字符,在windows下使用: 开始>所有程序>附件>系统工具>字符映射表.

【把flash player的焦点带给文字框】
stage.focus = field;
把焦点移除:
stage.focus = null;
注意: 当.swf文件首次载入至网页浏览器时,并没有焦点.因此,以程序的方式把焦点指定给flash应用程序的一个元素前,必须先把焦点移至flash player.

【以actionscript选取文字】
使用textfield.setselection(beginindex:int, endindex:int):void
为了可以正常选取文字,文字框必须具有焦点:
stage.focus = field; //把焦点设给文字框
field.text = "this is example text"; //设定文字
field.setselection(0, 4); //把"this"这个单词以高亮显示
使用只读的selectionbeginindex和selectionendindex属性访问所选取的字符范围的索引.

【在文字内设定安插点(游标位置)并访问游标位置的索引值】
可以使用textfield.setselection()把起始和结尾的索引参数都设成相同值,在文字内设定游标位置(假设具有焦点):
field.setselection(0, 0); //在第一个字符前摆放安插点
trace(field.caretindex); //输出游标位置的索引值

【当文本字段受到选取或取消选取时给予响应】
获得焦点时: focusevent.focus_in
失去焦点时: focusevent.focus_out
通过键盘(tab键)把焦点移除时: focusevent.key_focus_change
通过鼠标把焦点移除时: focusevent.mouse_focus_change
focusevent 类有一个relatedobject属性.就focus_in事件而言,relatedobject属性是刚才拥有焦点的对象的引用地址;对于 focus_out,key_focus_change以及mouse_focus_change事件,relatedobject属性是刚接收到焦点的 对象的引用地址.
focus_in和focus_out事件都是在焦点改变后发生的,所以两者都是不可取消的事件.对于key_focus_change和mouse_focus_change事件,可以使用focusevent.preventdefault()方法取消默认行为:
field.addeventlistener(focusevent.key_focus_change, onkeyfocus);
private function onkeyfocus(event:focusevent):void {
     if(field.text == "") {
         event.preventdefault(); //当field没有任何文字前,不允许使用tab键把焦点移除
     }
     //event.relatedobject就是刚才拥有焦点的对象的引用地址,即下一个获得焦点的对象的引用地址
}