??xml version="1.0" encoding="utf-8" standalone="yes"?> W二阶段Q?br />
一般情况下Q第二阶D늚目标阶段Q也是执行mxml文档的目标节炚w|的那个事g处理函数Q然后再处理对应的监听器Q处理目标和冒阶段的监听器Q注册的那个处理函数?/p>
如果文档该节点,没有配置事g处理Q则只执行通过addEventListener注册的事件处理方法,否则Q如果配|了Q就先执行mxml的配|函数处理,接着处理通过监听器注册的函数?/p>
最后就是冒泡阶D: 而普通函敎ͼ和类定义的普通方法,以及c静态方法都有不同的地方?br />
相同点:useCapture
为trueQ?br />
W二U就是处理目标和冒阶段的监听器Q第三个参数useCapture
为falseQ?br />
捕获阶段程Q?br />
Flex会去查找事g的触发源Q它是通过Ҏ(gu)C元?root display object)逐层向下寻踪Qƈ从上往下,依次触发q些节点的当前事件的处理函数Q如果他们都用捕获阶D늚监听器注册了q个事gQ直到找?strong>事g发v源头的父节点。ƈ触发完父节点的这个事件ؓ止。但它不会调用事件触发源节点的事件?br />
例如Q?br />
test.mxml文g下:
application节点--vboxQid=vbQ节?-buttonQid=btQ节炏V?/p>
如果在application的creationComplete中:以上所有组件的click事g注册为捕L听器?br />
如:
addEventListener(MouseEvent.CLICK, btnClick2, true);
vb.addEventListener(MouseEvent.CLICK, btnClick3,true);
bt.addEventListener(MouseEvent.CLICK, btnClick4,true);
如果在bt上点击,执行程如下Q?br />
Flash Player会去查找事g的触发源QbtQ,通过Ҏ(gu)C元?root display object)Q这里就是applicationQ逐层向下寻踪Qƈ从上往下,依次调用它们的click事gQ如果他们都注册了捕获阶D늚click事gQ直到找C件的发v源头的父节点Q上面例子中会找到vbQƈ执行完vb的click事g后,׃再查找下边的btlg和执行它的click事g?/p>
q个阶段与捕获阶D늛反,它会从从目标节点的父节点开始依ơ向上查扑ƈ执行父节点的mxml配置事g和通过监听器注册的事g处理函数。(q些处理函数也是用处理目标和冒阶段的监听器注册的)
也就是说Q捕获阶D늚事g触发只能是用处理q个阶段的监听器L册。目标和冒阶段的事件触发,也只能是处理q个阶段的监听器L册。如果,要让同一个事Ӟ在捕获阶D|目标和冒泡阶D都执行的话Q需要用addEventListener注册两次Q将W三个参?code>useCapture true和false各设|一ơ?/p>
他们都是Functioncȝ对象?br />
不同点:
在作函数l定上,Q函数绑定:是函数赋值给另一个函敎ͼ或者利用call或applyҎ(gu)函数绑定到别的对象上调用)
如果是类的普通函数绑定到别的对象上去Q那么函C的thisQ指的就是该cȝ实例Q无Z是用call方式Q还是将函数赋值给另一个对象,this始终指的是先前函数所在的那个cȝ实例对象Q而如果是一个普通函敎ͼthis指的是当前l定到的那个兌对象?br />
l对象动态创建的Ҏ(gu)和普通函CP因ؓ该方法其实就是将一个匿名的普通函数赋l对象的Ҏ(gu)变量的,如:obj.fun=function(str){alert(str)} ?br />
l定方式Q比如obj.fun.call(obj2) q个方式是fun函数l定到obj2上执?br />
W二U方式: obj2.funName= obj.fun; obj2.funName();
Z么说W二U方式也是一U绑定,写个例子证明一下:
如果obj.fun(){h(hun)于obj.fun.call(obj);
如果Qobj2.funName= obj.fun; //因ؓ函数是Functioncd的对象,那么obj2.funName?obj.fun一样都是引用同一个对象?br />
那么obj2.funNameQ)也可{h(hun)于obj.fun.call(obj2);
说明一下:cȝ静态函数是定义cȝ时候就存在了它的Function对象Q而类的普通函数则是在c?实例化的时候才生成对应的函数的Function对象
关于callҎ(gu)Q详见Function的callҎ(gu).api文档?br />
函数l定Q其实就是指Q将一个函C(f)时的赋给某个对象Q该对象׃(f)时的拥有了这个函敎ͼ但实际上对象上是没有q个函数定义?/p>
protected function button1_clickHandler(event:MouseEvent):void{
2 //q里是新创徏一个弹出窗体对象,UserWin定义的一个容器组件对?/span>
3 var win:UserWin = new UserWin();
4 var user:TblBsUserType = new TblBsUserType();
5//user对象传递给弹出H体Q其中data为win里头的一个空对象。在win里边的代码是public data:Object={};
6 win.data.user = user;
7//通过q种Ҏ(gu)lwind一个事件监听器
8 win.addEventListener("sendData",onSendData);
9 PopUpManager.addPopUp(win,this,true);
10 PopUpManager.centerPopUp(win);
11 }
12
13 private function onSendData(e:Event):void{
14 var user:UserType = e.currentTarget.data.user;
15 Alert.show(ro.toString());
16 }
protected function button1_clickHandler(event:MouseEvent):void
2 {
3 var win:UserWin = new UserWin();
4 var user:TblBsUserType = new TblBsUserType();
5 win.data.user = user;
6 win.data.send = add;
7 //win.addEventListener("sendData",onSendData);
8 PopUpManager.addPopUp(win,this,true);
9 PopUpManager.centerPopUp(win);
10 }
11
12//l果处理函数
13private function add(user:TblBsUserType):void{
14 if(null != user.butyId && "" != user.butyId){
15 ro.addUser(user);
16 }
17 }
那么在弹出窗体中我们只需要调用data.send(data.user);可以了?br />
备注Q其实以上两U方法,Z使用方便Q其实都q可以优化的地方Q比如,事g处理方式Q我们还可以在自定义lg中声明事?br />
<fx:Metadata>
[Event(name="sendData",type="flash.events.Event")]
</fx:Metadata>
让用组件的mxml文档也能昄注册事gQ如Q?lt;user:UserWin x="115" y="231" sendData=“sendDataHandler(event)”>
</user:UserWin>
另外Q在函数处理方式上,我们是利用函数绑定到对象的方式,来处理数据的Q其实,Z使用接口的h更明一些,我们可以把这个函数预先定义ؓlg的属性,比如Q[Bindale]public var sendData:Function;q样在创建组件对象的地方Q就可以明确的把用户自定义的处理函数赋值给q个属性(sendDataQ?br />
MQ不怎么P事g处理和函数处理都可以完成我们的要求,任选其一卛_?br />
autoLayout="true" id="bc">
<s:layout >
<s:TileLayout />
</s:layout>
</s:BorderContainer>
我要在上边这个容器里动态装入一些组Ӟ很有可能容器的高度不够装下多个组Ӟq个时候,p让程序动态的改变容器的大?br />
改变容器的大可以根据添加的最后一个组件的top和height来决定,那么我们什么时候才能获取得最后一个组件的大小呢?看下边的代码Q?br />