热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

事件处理基础知识(二)事件里的currentTarget和target的区别?

事件里的currentTarget和target的区别?图1事件流三个阶段例如:1<?xmlversion1.0encodingutf-8?

事件里的currentTarget 和 target的区别?

 

图1 事件流三个阶段

例如:

 1 
 2  3                xmlns:s="library://ns.adobe.com/flex/spark" 
 4                creatiOnComplete="init()"
 5                xmlns:mx="library://ns.adobe.com/flex/mx" min min xmlns:com="com.*">
 6     
 7         
 8     
 9     
10         
11     
12     
13         [CDATA[
14             import mx.collections.ArrayCollection;
15             import mx.controls.Alert;  
16             private function init(): void  
17             {  
18                 addEventListener(MouseEvent.CLICK, clickHandler);                   
19             }  
20             private function clickHandler(event: MouseEvent): void  
21             {  
22                 trace("target: " + (event.target as DisplayObject).name +"引起的事件" 
23                     + "\ncurrentTarget: " + (event.currentTarget as DisplayObject).name+"处理事件");  
24             }      
25         ]]>
26         
27     
28     
29     
30     
31     
32         
33         
34     
35 

图2 程序运行图

 

点击第一行文字:

  target: Label5引起的事件
  currentTarget: e0处理事件

点击panel空白区:

  target: Group10引起的事件
  currentTarget: Panel7处理事件
  target: Group10引起的事件
  currentTarget: e0处理事件

点击按钮1:

  target: btn引起的事件
  currentTarget: Panel7处理事件
  target: btn引起的事件
  currentTarget: e0处理事件

点击按钮2:

  target: btn2引起的事件
  currentTarget: btn2处理事件
  target: btn2引起的事件
  currentTarget: Panel7处理事件
  target: btn2引起的事件
  currentTarget: e0处理事件

总结:在事件流的过程中,目标阶段确定的目标对象由Event中的target属性来记录,冒泡阶段移动的游标则由currentTarget来记录。事件对象冒泡过程中每往上移动一级,就会克隆出一个仅与前副本currentTarget不同的新副本。简单说,target是事件的调用对象(event dispatcher)(谁引发了事件),currentTarget是事件的处理对象(event processor)(事件发生后,谁来处理!)

target 属性
target 属性包含对作为事件目标的对象的引用。在某些情况下,这很简单,例如当麦克风变为活动状态时,事件对象的目标是Microphone 对象。但是,如果目标在显示列表中,则必须考虑显示列表层次结构。例如,如果用户在包括重叠的显示列表对象的某一点输入一个鼠标单击,则 Flash Player 和 AIR 始终会选择距离舞台层次最深的对象作为事件目标。对于复杂的 SWF 文件,特别是那些通常使用更小的子对象来修饰按钮的 SWF 文件,target 属性可能并不常用,因为它通常指向按钮的子对象,而不是按钮。在这些情况下,常见的做法是将事件侦听器添加到按钮并使用 currentTarget 属性,因为该属性指向按钮,而 target 属性可能指向按钮的子对象。

currentTarget 属性
currentTarget 属性包含对当前正在处理事件对象的对象的引用。您并不知道哪个节点当前正在处理您要检查的事件对象,虽然这似乎很奇怪,但请记住,您可以向该事件对象的事件流中的任何显示对象添加侦听器函数,并且可以将侦听器函数放在任何位置。而且,可以将相同的侦听器函数添加到不同的显示对象。随着项目大小和复杂性的增加, currentTarget 属性会变得越来越有用。

实践应用:使用事件捕获和冒泡可以最大程度减少事件处理函数

ActionScript 3.0 中的事件模型引入了事件捕获和事件冒泡的概念。利用事件冒泡可帮助您优化 ActionScript 代码执行时间。您可以在一个对象(而不是多个对象)上注册事件处理函数以提高性能。例如,想象创建这样一种游戏,在该游戏中用户必须以最快的速度单击苹果以将其销毁。该游戏将删除屏幕上各个被击中的苹果并为用户增加分数。要侦听由各个苹果调度的 MouseEvent.CLICK 事件,您可能会编写以下代码:

 1 const MAX_NUM:int = 10;
 2 var sceneWidth:int = stage.stageWidth;
 3 var sceneHeight:int = stage.stageHeight;
 4 var currentApple:InteractiveObject;
 5 var currentAppleClicked:InteractiveObject;
 6 for ( var i:int = 0; i )
 7 {
 8 currentApple = new Apple();
 9 currentApple.x = Math.random()*sceneWidth;
10 currentApple.y = Math.random()*sceneHeight;
11 addChild ( currentApple );
12 // Listen to the MouseEvent.CLICK event
13 currentApple.addEventListener ( MouseEvent.CLICK, onAppleClick );
14 }
15 function onAppleClick ( e:MouseEvent ):void
16 {
17 currentAppleClicked = e.currentTarget as InteractiveObject;
18 currentAppleClicked.removeEventListener(MouseEvent.CLICK, onAppleClick );
19 removeChild ( currentAppleClicked );
20 }

此代码对各个 Apple 实例调用 addEventListener() 方法。此外,它还会在用户单击每个苹果时使用 removeEventListener() 方法删除对应的侦听器。然而, ActionScript 3.0 中的事件模型为某些事件提供了一个捕获和冒泡阶段,允许您侦听来自父InteractiveObject 的这些事件。因此,可以优化以上代码并在最大程度上减少对 addEventListener() 和removeEventListener()方法的调用次数。以下代码使用捕获阶段侦听来自父对象的事件:

 1 const MAX_NUM:int = 10;
 2 var sceneWidth:int = stage.stageWidth;
 3 var sceneHeight:int = stage.stageHeight;
 4 var currentApple:InteractiveObject;
 5 var currentAppleClicked:InteractiveObject;
 6 var container:Sprite = new Sprite();
 7 addChild ( container );
 8 // Listen to the MouseEvent.CLICK on the apple's parent
 9 // Passing true as third parameter catches the event during its capture phase
10 container.addEventListener ( MouseEvent.CLICK, onAppleClick, true );
11 for ( var i:int = 0; i )
12 {
13       currentApple = new Apple();
14       currentApple.x = Math.random()*sceneWidth;
15       currentApple.y = Math.random()*sceneHeight;
16       container.addChild ( currentApple );
17 }
18 function onAppleClick ( e:MouseEvent ):void
19 {
20       currentAppleClicked = e.target as InteractiveObject;
21       container.removeChild ( currentAppleClicked );
22 }

 


推荐阅读
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
author-avatar
小编106
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有