对事件的通俗理解

前言:flex是面向组件开发的,侧重于实现人机交互的程序设计方法。实际上,正是因为其强大的事件机制,我们才能开发出令人惊艳的表现层页面。以下是根据我自己的理解写的一个教程,可能有不完善的地方,欢迎大家讨论。

什么是事件?
百度百科是这样解释的:是法律事实的一种。是指与当事人意志无关的那些客观现象,即这些事实的出现与否,是当事人无法预见或控制的。

我理解的事件就是发生的一些事情。比如刮风、下雨、打雷;比如吃饭、睡觉、工作等等。在flex中,事件是确定计算机执行哪些指令以及何时执行的机制。
本质上,“事件”就是所发生的、ActionScript 能够识别并可响应的事情。通俗点讲,你要让计算机干活,干什么活,什么时候开始干活,就得对计算机做些事情,或者它自己对自己做些事情,这个事情就是事 件。当然,你做的事情计算机一定要能够识别。你可以敲键盘,可以按鼠标,可以扫描文件。你还可以设置让它杀完毒之后自动关机。但是,你不能对着电脑 说:hi,你半个小时之后关机。这样,它肯定不知道你要干什么。因为它不能识别你所说的关机指令,或者说,它没有注册对你叫“半个小时之后关机”这个事件 的响应。

什么叫事件对象?
事件是对事件对象的一种抽象。我们不会傻傻地跟别人说:事件发生了。我们通常都会说:XX事件发生了。XX事件就是事件的一个具体实现。下面这个 例子很重要,它会涉及到这个教程里面的很多概念,请务必注意:今天下午丁姐去小贩那里买苦瓜就是买菜事件的一个事件对象。在flex里面,大多数组件都能 产生事件。但是,只有某个组件对象在某时刻产生的事件才能叫事件对象。

什么叫事件侦听器?(事件处理程序)
就是说事件对象产生了,有人接受到这个事件对象,并作出了相应的响应。比如说,今天下午下雨这件事发生,我接受到这件事,就去收衣服。收衣服就是 我对下雨这个事件对象的响应。回到上面的例子:今天下午,丁姐要去买苦瓜了,OK,她来到小贩那里,说要买苦瓜,事件对象产生。小贩呢?看到有顾客来了, 肯定很高兴塞,他接下来做的事情就是一个事件处理程序:取菜、称重、收钱交货。当然,小贩干的一些缺斤少两的事就不讨论了,小贩把这个过程封装起来,每次 丁姐来买菜他就调用这个过程。在flex里面,侦听器就是一个函数,它接受事件对象,并作出相应的响应。

什么叫注册事件侦听器?
老板告诉小贩,如果有人来买菜,你就怎么怎么滴?于是小贩就记住了,只要有人来买菜,他就按老板的要求做。当然,如果别人来买布,小贩就不知道怎 么做了,因为老板没告诉他该怎么做。所以他会忽略掉买布的。当然了,如果是一位新来的伙计,老板对他进行了培训该怎么卖菜。但是现在还轮不到他当值,所 以,丁姐来买菜时,这位新来的伙计是不会招呼她的,即使丁姐嗓门再大也没用。对不起,虽然我会卖菜,可是老板没叫我卖菜。同理,对一个flex组件注册侦 听器就是告诉组件当事件发生时调用事件处理程序。有两种方法可以注册事件侦听器,一种是在组件里面使用click属性

//考虑到文章排版,以下代码不是完整实例
<mx:Button id="myButton" click="sub(event);" />
public function sub(event:Event):void {
//事件处理程序
}

还有一种是写在AS里面:
//初始化时就为组件注册事件侦听器
<mx:Application  initialize="createListener();">
<mx:Button id="myButton" />
public function sub(event:Event):void {
//事件处理程序
}
public function createListener():void {
//前一个参数是参数类型,后一个参数是侦听器函数名
myButton.addEventListener(Event.type,sub)
}

事件流
丁姐去小贩那里买菜,这是一个大型连锁卖场,小贩上面有主管,主管上面有经理。丁姐来买菜时,小贩、主管、经理都被告知需要卖菜(都已注册事件侦 听器),单丁姐买菜这个事件对象产生后,经理最先知道,然后主管知道,最后小贩知道丁姐来买菜,小贩就是事件对象目标,然后小贩执行卖菜程序,然后就是主 管执行卖菜程序,最后是经理执行卖菜程序。在flex里面,如果多个组件嵌套在一起,呈现包含关系,当事件发生时,事件对象会从外至里依次遍历所有组件, 直到达到目标组件停止遍历,然后再从目标组件往外遍历,如果该组件已注册事件侦听器,则执行该侦听程序。

事件对象的生命周期:(原创:未经证实)
事件发生    产生事件对象     发送事件对象 捕获事件对象   处理事件
10月30日注:实际上,是有事件对象的产生我们才说事件发生。这个事件对象包含了这个事件发生时的一些具体属性。好比:“天鹅”号台风的产生就是发生台风的一个具体事例。两者应该不存在先后关系。


7请描述这两种注册事件侦听器的异同:
click="sub(event);"

myButton.addEventListener(Event.type,sub)

这个我研究了一天,主要是说一下我自己的想法,欢迎大家一起讨论。
我有两种想法:现罗列多下
一、
(估计这种想法是错误的)
click="sub(event);"表示click事件发生后,执行sub(event)方法,接受Event类型的事件对象。(如果 click事件发生之后不产生类型为Event类型的事件对象怎么办?)(有人说打雷了我们却看到“天鹅”号台风的产生,实际上是不可能的)
myButton.addEventListener(Event.type,sub)表示click事件发生后,产生类型为Event的事件对 象,如果事件对象的type属性与注册侦听器时的第一个参数匹配,则调用sub(event)方法。(如果type属性符合第一个参数但是事件对象不属于 Event类型呢?)(程序会报错,参数类型不能强制转换,证实了flash编译器是根据事件对象的类型调用侦听器函数,跟侦听器函数可以接受的参数类型 没有关系)

以上不懂的,可以联系我,我有具体事例证实。

实际上,计算机是根据对象的一些具体特征去识别事件的。这句话很重要,理解了,就没什么问题了。

二、
click="sub(event);"
myButton.addEventListener(Event.type,sub)
编译时都把sub(event)写入到组件的一个方法列表里。事件对象发生时,结合事件流的原理,判断事件对象的类型,如果符合侦听器的参数,则执行该事件侦听器。


疑问?如果对一个组件同时注册两种不同的事件侦听器呢?
优先调用click="",然后才调用add方法。

你可能感兴趣的:(事件)