Flash 板


LINE

网志图文好读版: http://ppt.cc/sygC ============================================= 当事件被发送出来之後。Event一般来?都会有一个Flow。 Flow分三个部分: Capture(捕获阶段) Targeting(目标阶段) Bubbling(冒泡阶段) 其关系图如下: http://claire-chang.com/wp-content/uploads/2013/08/efAzj.jpg
值得一提的是,在FLASH里,只有和UI相关的物件 会有上图所示的目标及补获阶段的事件流, 一般像是Timer、Loader事件,是直接进入目标阶段,并不会有下图所示的事件流的流程。 在宣告Event时,也可以先指定事件是否要完整的跑完全部的流程。 var event:Event = new Event(type, bubbles, cancelable); 参数说明(官方文件) type:String是要发送的事件的识别名称EX:Event.COMPLETE bubbles:Boolean预设值是false,这个值是用来设定是否要有冒泡阶段, 如果传false,代表他不会跑完全部的流程,只会从Capture到target阶段就停止。 cancelable:Boolean预设值是false, 这个值是用来设定是否这个事件可以被event.preventDefault();取消, 如果设定为true的话,代表此事件是可以被取消的 (稍候在dispatchEvent会更详述这部份)。 常用的可以取消的事件有(cancelable为true): FocusEvent.MOUSE_FOCUS_CHANGE FocusEvent.KEY_FOCUS_CHANGE TextEvent.TEXT_INPUT。 而发送事件则是用这一段程式码: var result:Boolean = box.dispatchEvent(event); 在发送事件时,要注意,假使今天我们是在STAGE里面有一个box物件, 那当我们用box.dispatchEvent(event); 即使事件是用box发送的,事件还是会从stage > root > box这样跑。(请见上图) 假如在建立Event时,bubbles设为true, 那在上图跑的流程为stage > root > box > root > stage。 而若bubbles设为false,跑的流程则是stage > root > box 当我们用root.dispatchEvent(event);时 bubbles设为true,上图跑的流程为stage > root > stage bubbles设为false,流程为stage > root 由此可知,事件流只会到目标(Target),就会停止往下传。 假如今天box里面有一个物件button,若是用box.dispatchEvent(event), button物件是不会接到事件流的。(因为到目标阶段便会开始bubbles或停止) 并且假如今天root里同时有box和box2两个物件, 假使我们用box.dispatchEvent(event),则box2也不会接到事件。 至於第三个在建立Event的参数cancelable,不论值是true或false, 都不会影响事件流的流程。 那他的作用是做什麽的呢? 我们可以发现,dispatchEvent有回传一个布林值, cancelable就是在影响这个布林值的传回参数。 今天我们假如要创建一个物件, 但是要让使用者有权力去阻止这个事件发生後的後续发展时,可以这样写 if(this.dispathEvent(event)){ trace("success!"); //在这写後续发展 } 假使使用者在监听的途中呼叫 event.preventDefault();, 并且EVENT的cancelable为true时,dispatchEvent回传的值就会是false, 便不会执行trace("success!");那块区块。 但假使EVENT的cancelable为false时, 不论你在事件执行中有没有呼叫event.preventDefault(), dispatchEvent回传的值就会是true。 一般我们会在传递事件的途中,去将事件拦截下来。增加监听事件的程式码如下 box.addEventListener(MouseEvent.MOUSE_DOWN,parent1Event); 官网关於addEventListener的说明如下 addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void 传入的参数意义如下: type(String):事件名称 listener(Function):要执行的Function useCapture(Boolean):这个和本篇要说的事件流有关,当今天传入的值为true, 则只能在补获阶段去抓取事件,在冒泡阶段是听不到的。 如果将 useCapture 设置为 true,则侦听器只在捕获阶段处理事件, 而不在目标或冒泡阶段处理事件。如果 useCapture 为 false, 则侦听器只在目标或冒泡阶段处理事件。 要在所有三个阶段都侦听事件,需注册 addEventListener 两次: 一次将 useCapture 设置为 true,一次将 useCapture 设置为 false。 不过要注意的是,当今天若useCapture为true时,并不会听到target阶段时的事件, 但若为false时,也可以听到target阶段时的事件。 假使今天我们用box.dispatchEvent(event);来发送事件, 然後box的监听事件的useCapture设为true。 ex : box.addEventListener(MouseEvent.CLICK, rootClick, true); 这样rootClick事件并不会被呼叫到。 若box的监听事件的useCapture设为false 。 ex : box.addEventListener(MouseEvent.CLICK, rootClick, false); 这样rootClick事件便会被呼叫到。 priority(int):若今天同时有很多个监听器同时监听同一事件, 可用这个值来设定那一个监听器应该被优先执行。 数字愈高代表会愈快执行该事件侦听程式。 useWeakReference(Boolean):是否使用弱关连。 若是用弱关连,当被监听的物件所指到的变数被指向记忆体的其他地方, 这个关系也会一并被取消(物件会被GC回收)。 但如果传进的值是false,当今天被监听的物件的其他关连被指向别处时, 该物件不会被GC回收,需要手动removeEventListener时,该物件才会被GC回收。 除了上述的几个参数外,还有几个函数可以中断事件流的流程。 那就是stopPropagation()和stopImmediatePropagation() 这两个可以停止事件流继续下去。 那这两个函数有什麽差别呢? 下图可以很清楚的解释差异: stopPropagation():会把同一阶层的其他事件跑完才停止。 图: http://claire-chang.com/wp-content/uploads/2013/08/5MYe3.jp stopImmediatePropagation():立刻停止之後所有的事件流。 图: http://claire-chang.com/wp-content/uploads/2013/08/jleAX.jpg
假如今天box同时有两个监听函数如下 box.addEventListener(MouseEvent.MOUSE_DOWN,eventMouseDownHandler1,false,1); box.addEventListener(MouseEvent.MOUSE_DOWN,eventMouseDownHandler2,false,2); 则由於priority值的关系, eventMouseDownHandler2 会先被执行, eventMouseDownHandler1 在之後才被呼叫。 那若是在eventMouseDownHandler2里面呼叫event.stopPropagation(), eventMouseDownHandler1还是会被执行才将事件流中断。 但是若在eventMouseDownHandler2里面呼叫event.stopImmediatePropagation(), 则eventMouseDownHandler1就不会被呼叫到了 网志好读版: http://claire-chang.com/1054-as3的事件传递机制 延伸阅读: hasEventListener()与willTrigger()区别 http://ppt.cc/sqKU --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.163.78.91
1F:推 viceversa56:好久不见的心得文 推推 08/30 21:51
2F:推 lulu7953:认真推~ 08/30 23:30
3F:推 newton510:好文~ 推~~ 08/31 16:05
4F:推 BIAN:推一个 09/11 10:02
5F:推 onchin:FLASH新手 虽然只看得懂前面一小段也获益良多@@ 推~ 10/13 00:37







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:iOS站内搜寻

TOP