zoukankan      html  css  js  c++  java
  • 关于Flex事件机制的理解

    优点:减少同一个UI树上对象监听器数量,从而带来性能优化。

    1.FLEX 事件机制是分为三个阶段

       捕获---〉目标----〉冒泡

      所谓捕获:即是寻找目标的过程,是目标的父节点。注:起点是Stage,终点也是Stage。

      所谓目标:即是找到目标。

      所谓冒泡:可以理解为捕获的返过程。

      此为官方图解。

      事件的派发:

      Flex中可以通过dispatchEvent()方法手工派发事件, 所有UIComponent的子类都可以调用此方法. 
      语法: 
      objectInstance.dispatchEvent(new Event("event_type"):Boolean 
      参数event_type是Event对象的type属性. 除非对事件调用 preventDefault()(在这种情况下,它返回 false),否则值为 true
      可以使用此方法派发任意事件, 而不仅仅是用户自定义事件, 比如: 可以派发一个Button的Click事件. 
      var result:Boolean = buttonInstance.dispatchEvent(new Event(MouseEvent.CLICK));

      在Flex应用中不是必须对新派发的事件进行处理, 如果触发了一个事件, 而没有对应的Listener时,Flex忽略此事件. 

      如果想给Event对象添加新属性, 就必须继承Event类,然后定义新属性。

    2.target和currentTarget究竟谁是事件的派发者?

       targe:简单说就是指向的目标对象。并非事件的派发者。在一个事件整个生命周期中所有被派发的事件处理函数内部的target对象是一样的,每个被监听者派发的事件处理函数      中的target一定都是同一个对象。

       currentTarget:事件的派发者。调用注册在事件上的回调函数的那个对象,简单的说就是派发事件的对象。

    3.如何进行代码编写。

      首先看看AS3中为IEventDispatcher类型对象注册事件监听的接口

      addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void{}

      如果只是简单的这样写:

      panel.addEventListener(MouseEvent.CLICK, onMouseClickHandler);

      那么该事件的生命周期将是:整个生命周期。即捕获-〉目标->冒泡,所有目标父节点上注册的事件都会被执行两次(捕获阶段一次+冒泡阶段一次)!这样如果有大量的事件监听将会很消耗资源。所以我们要对该方法中的参数进行设置。

      首先了解该方法中各个参数的意义。

      type:事件的类型。

      listener:响应该事件时处理函数。

      useCapture:是否进行触发,或者说是派发,默认为false。

       如果将 useCapture 设置为 true,则侦听器只在捕获阶段处理事件,而不在目标或冒泡阶段处理事件。如果 useCapturefalse,则侦听器只在目标或冒泡阶段处理事件。若要      在所有三个阶段都侦听事件,请调用两次 addEventListener(),一次将 useCapture 设置为 true,第二次再将 useCapture 设置为 false

      priority:默认为0,事件侦听器的优先级。优先级由一个 32 位整数指定。数字越大,优先级越高。优先级为 n 的所有侦听器会在优先级为 n-1 的侦听器之前处理。如果两个或更   多个侦听器共享相同的优先级,则按照它们的添加顺序进行处理。默认优先级为 0。

      useWeakReference:确定对侦听器的引用是强引用,还是弱引用。强引用(默认值)可防止您的侦听器被当作垃圾回收。弱引用则没有此作用。

      注意:成功注册一个事件侦听器后,无法通过额外调用 addEventListener() 来更改其优先级。若要更改侦听器的优先级,必须先调用  EventDispatcher.removeEventListener()。   否则会产生内存问题。由于垃圾回收器不会删除仍包含引用的对象,因此不会从内存中自动删除使用已注册事件侦听器的对象。然后,可以使用新   的优先级再次注册该侦听器。

      如果在正在处理事件的节点上注册事件侦听器,则不会在当前阶段触发事件侦听器,但会在事件流的稍后阶段触发,如冒泡阶段。

      如果从正在处理事件的节点中删除事件侦听器,则该事件侦听器仍由当前操作触发。删除事件侦听器后,决不会再次调用该事件侦听器(除非再次注册以备将来处理)。 

  • 相关阅读:
    【Jmeter】 Report Dashboard 生成html图形测试报告
    【Python】更优的字符串格式化方式 -- "format"替代"%s"
    【Jmeter】压测mysql数据库中间件mycat
    UTF-8文件的Unicode签名BOM(Byte Order Mark)问题记录(EF BB BF)
    【Python】常用排序算法的python实现和性能分析
    【Python】模块学习之Timer定时任务,递归定时自调获取博客浏览量
    博客园文章添加阅读目录及CSS样式的方法总结
    【Python】解决Python脚本 在cmd命令行窗口运行时,中文乱码问题
    【Python】模块学习之locust性能测试
    【Python】模块学习之使用paramiko连接Linux,远程执行命令,上传下载、文件
  • 原文地址:https://www.cnblogs.com/zhangygl/p/3753778.html
Copyright © 2011-2022 走看看