AS3:dispatchEvent与事件流,点击事件的穿透性

AS3中的交互也是基于事件驱动的。这段时间,为了做一个导航栏,dispatchEvent方法深深的让我困惑!在多层的Sprite嵌套中,为了在最外层处理点击事件,我使用了dispatchEvent方法来传递点击事件。这种方法是可行的,不过其行为有一点点出乎我的意料。

捕捉点击事件,对事件的target实行类型转换的时候,没有转型成功。但是想要实现的效果,却达到了。这个问题困扰了我好久。直到我明白了点击事件的穿透性和dispatchEvent在事件流中扮演的角色以后,才豁然开朗。

在开始说重点之前,有必要介绍一篇文章给同样处于困惑状态中的朋友参考:

《dispatchEvent的应用》。此文基本上说明白了dispatchEvent的作用。

要明确一点,dispachEvent其实就是发起事件。并且,捕获该事件的,是已经注册了该事件监听器的对象自身。也就是说,事件的发起和捕获,发生在同一个对象身上。

既然如此,那么事件是如何传递给外层对象的呢?这个问题其实不是问题。因为发起事件是在对象内部,而捕获对象事件的处理方法,是控制该对象的另外一个对象。

回头来看多层Sprite构造的菜单点击事件这个实际情形。

为了把最底层的对象的点击事件传递给菜单的控制者,我逐层使用dispatchEvent方法进行对象传递。最底层是一个一个的SimpleButton对象,所以其点击事件的target必然是SimpleButton自身。菜单控制者可以轻易通过判断SimpleButton的upState对象的文字,来判断用户具体点击了哪个按钮。

逻辑并不复杂,唯一的意外发生在点击事件的穿透性上。我为每层Sprite都定义了点击事件的监听器。那么处在中间层的Sprite势必事件重复引发。监听器会监测到来自自身引发的事件,还会监测到由我手动添加的dispatchEvent方法所引发的事件。Sprite嵌套的层次越深,一次点击事件所引发的重复事件就越多!在我开发的例子中,我嵌套了2个内层,一次点击引发4次事件。

在这众多的事件中,只有一次是我们真正需要的!在我这个例子中,target是SimpleButton的那个事件,明显就是我最终想要的,而不是其它事件。明白了这个道理,事情就很好处理了。对target进行安全转型。如果转型成功,则执行我们想要的动作;如果转型不成功,则放弃对该事件的处理。像这样:

var btn:SimpleButton = e.target as SimpleButton;
if(!btn) return;
... 这里执行想要的动作...

这就是dispatchEvent和点击事件的穿透性,在事件流中的全部秘密。在为子对象做导航菜单时特别有用。直接传递点击事件的方式,可以让我们省敲许多代码。不过在处理逻辑上,就要特别小心在意了。

抛砖引玉,在这里我就不写详细的实例了。

win7忘记密码:使用win7系统光盘的修改密码的方法

手上一台电脑,win7系统,忘记了密码,有光驱,有win7系统安装盘,如何修改密码呢?

1、用win7系统光盘启动安装程序。

2、选择语言后,选择左下角的“修复计算机”,进入“系统恢复选项”。选择已有的win7系统,会出现如下选项:

1A151CJ-0.jpg

选择命令提示符,就可以操作磁盘中的文件了。

接下来要做的,就是广为流传的替换法。因为win7的登录界面,可以运行一些程序,我们只要替换掉其中某个程序的文件名,改为执行“命令提示符”的程序c:\windows\system32\cmd.exe,之后就可以通过net user命令和net localgroup命令添加或修改用户信息了。以“启动讲述人”程序为例子,其文件名本来是narrator.exe,我们将之改名为narrator1.exe,之后再复制一份cmd.exe,并将其改名为narrator.exe,伪装为讲述人程序。这样,在登录界面就可以直接运行cmd.exe程序了!

步骤,一下都是命令行执行的命令:

c:

cd c:\windows\system32

ren narrator.exe narrator1.exe

copy cmd.exe narrator.exe

假设你的win7装在C盘。

昨晚这一步以后,重启计算机,从硬盘启动系统。在登录界面单击右下角的“轻松访问”按钮,在打开的窗口勾选“启动讲述人”,启动cmd窗口,输入命令:

net user ljfcn /add

net localgroup administrators /add

上面这两行添加一个叫ljfcn的管理员账号。当然,还可以修改已存在账号的密码:

net user administrator ljf123

将管理员账号 administrator 的密码重置为ljf123

经过测试,修改密码是即时生效的,修改后马上就可以登录系统了。如果是新增加的用户,还要重启才能生效。

特别提醒:如果不使用替换法,而是直接通过光盘启动,在“系统恢复选项”中的命令行执行添加用户、修改密码等操作,是无效的!

相关资源:

1、windows 7 原版光盘下载:http://www.iplaysoft.com/windows7-msdn-iso.html

2、曲线救国,windows 7 忘记密码怎么办? http://article.pchome.net/content-1137586.html

3、忘记Windows7、Vista、XP登陆密码怎么办?看攻略!http://www.vista123.com/vista/12106.html

如何在Flash Builder的ActionScript项目中使用Flash的UI组件?

Flash的UI组件为开发项目提供了方便。可是在Flash Builder中,默认是没有提供这些组件的。如何把这些组件搬过来呢?

当我们创建ActionScript项目时,是不能使用FLEX提供的UI控件的。除了可以使用第三方制作的UI库(如AsWing)之外还可以直接使用Flash CS4中内置的UI组件。方法如下:

  1. 在flash中新建一个工程,把所有的ui控件逐个拖放到场景中
  2. 进入菜单Publish Settings,将 Export SWC 项勾上
  3. Export Movie,输入文件名,确定之后就出现了swc文件
  4. 进入Flash builder,在项目属性中引用刚刚导出的swc文件
  5. import fl.controls.*;
  6. var btn:Button=new Button(); //直接创建UI控件即可。

终于找到可用的方法了。

方法来源:http://bbs.airia.cn/FLEX/thread-10130-1-1.html

AS3:被加载的swf产生错误:TypeError: Error #1009: Cannot access a property or method of a null

一个SWF单独运行时运作良好。被另一SWF加载后就产生错误:

TypeError: Error #1009: Cannot access a property or method of a null 

最近研究了主要的报错情况,在剖析报错情况前,先看下我们用的加载代码:

AS3代码
var loadSwf:Loader = new Loader;   
loadSwf.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCom)   
loadSwf.load(new URLRequest("demo.swf"))   
private function loadCom(event:Event):void {   
    var loadInfo:LoaderInfo = event.target as LoaderInfo;   
    var getSwf:DisplayObject = loadInfo.content as DisplayObject;   
    stage.addChild(getSwf);   
}

报错情况有以下几处:

1.显示对象根目录错误

有些人为图方便,直接在把Loader对象用addChild()添加到舞台上,这是错误的,因为有些子SWF的程序在文档类中,把parent看成是stage,而直接添加Loader对象,子SWF中的parent就是Loader了,Loader相当于另一个容器,而导致子SWF执行不正常.

解决方法:看看上面的加载代码,已经是解决方法了,第六行,我们获得的getSwf其实是一个文档类的实例化,因为文档类必须继承DisplayObject的,所以获取的类型为DisplayObject是肯定正确的.我们把文档类直接添加到stage中,这样就保证了与原SWF的结构一致.

2.加载进来提示无法访问空对象引用的属性或方法.

这是因为子SWF还没有添加到舞台上就调用stage了,这时stage是null值,所以提示这个错误.

解决方法:在子SWF的构造函数中,添加到舞台上再执行代码.

AS3代码
public function Main(){//构造函数
if (stage){   
        init();   
}else{   
        addEventListener(Event.ADDED_TO_STAGE, init);      
}}   
private function init(e:Event = null):void {      
//你的代码在这执行      
}  

来源:http://hi.baidu.com/80bith/blog/item/1ae4603522d5f01d90ef39f8.html

AS3运行时加载外部库,调用swf中的库

使用Flash Builder创建ActionScript项目,最苦恼的事情莫过于没有素材了。如果能通过运行时加载的方式提供素材,那么开发起项目来就事半功倍了!下面介绍的,正是这种运行时加载素材的方式。

【例1】
最近在网上看到一篇关于ApplicationDomain类的文章,有兴趣的朋友不防也去看看,
网址:http://eidiot.net/
参考:http://oliwen.blog.163.com/blog/static/38057532200772891112440/

浅显的研究了一下,发现用这个类竟可以调用加载进来的SWF库文件,嘿嘿,以后做大型的网络开发,这个功能可就能派上大用场了.现将代码公视如下:

var loader : Loader = new Loader();
var context : LoaderContext = new LoaderContext(true, ApplicationDomain.currentDomain);
/* 加载到同域(共享库) */
context.applicationDomain = ApplicationDomain.currentDomain;
//context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
这是我写在针上做的一个测试,m2为加载进来的SWF,Tm为m2库中的链接类名.
loader.load(new URLRequest("m2.swf"), context);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadcom);
function loadcom(the:Event):void
{
var runtimeClassRef:Class = getClass("Tm");
var greeter:MovieClip = new runtimeClassRef();
addChild(greeter);
greeter.x=100;
greeter.y=200;

function getClass(className:String):Class
{
   return loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class;
}
}


 

【例2】
---------------------LittleSpace 扩展修改------------------------------
SkinOverAllNoCaption.swf 为FLVPlayBack 组件的一个皮肤~
我这里只调用一个舞台上的按钮【"playpause_mc"】,播放暂停按钮,
此按钮的链接名为:fl.video.skin.PlayButtonNormal

舞台第一帧书写 : this.playButtonNormalState = "fl.video.skin.PlayButtonNormal";
Ctrl+Enter发布SkinOverAllNoCaption.swf

然后新建一个fla,在第一帧写入:
var request:URLRequest = new URLRequest("SkinOverAllNoCaption.swf");
var loader:Loader = new Loader();
var skinTemplate;//注意这里不能定义类型,否则出错[访问未定义的属性]
loader.contentLoaderInfo.addEventListener (Event.COMPLETE, loadComplete);
loader.load (request);
function loadComplete (event:Event):void
{
skinTemplate = Sprite(loader.content);
trace (skinTemplate );
addChild (skinTemplate );
trace (skinTemplate.pauseButtonOverState);
trace (skinTemplate.playpause_mc);
//与加载swf交互
skinTemplate.playpause_mc.addEventListener (MouseEvent.CLICK,clickHandler);
}
function clickHandler (e)
{
//获得加载的swf中的库的定义
var runtimeClassRef:Class = getClass(skinTemplate.playButtonNormalState);
//或者使用这句
// var runtimeClassRef:Class = getClass("fl.video.skin.PlayButtonNormal");
trace (runtimeClassRef is Class);
var greeter:MovieClip = new runtimeClassRef();
addChild (greeter);
}
function getClass (className:String):Class
{
return loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class;
}

来源:http://hi.baidu.com/8090boy/blog/item/47678ea71d46d398d14358a2.html

BBSXP 2008 SP2页面显示500错误的修正办法(Cookies对象错误ASP 0200 : 80004005)

BBSXP 2008 SP2进入帖子显示错误如下:

Cookies 对象 错误 'ASP 0200 : 80004005'

'Expires' 特性越界

/bbs1/BBSXP_Class.asp,行 193

为 'Expires' 指定的日期早于 1980 年 1 月 1 日,或晚于 2038 年 1 月19 日,3:14:07 GMT。

原因已经在错误信息中指出来了。修正的办法是:

-----------------------------------------------------------------------------
- BBSXP 2008 (Build: 8.0.5) SP2    2010-09-05
-----------------------------------------------------------------------------
- 修正COOKIE保存时间超出2038年引起的问题
- BBSXP_Class.asp 文件中第193行添加 if int(Expires) > 365 then Expires=365
请替换BBSXP_Class.asp即可 或 自行在193行添加if int(Expires) > 365 then Expires=365

或下载文件进行替换:http://www.bbsxp.com/download/bbsxp2008.zip

来源网址:http://bbs.yuzi.net/ShowPost.asp?ThreadID=805274

广州地铁最新线路图

广州地铁最新线路图.gif

点击查看大图,原图地址:http://www.gzmtr.com/ckfw/dtxlt/dtxianlu_big.jpg

根据用户群定制网页界面实例之——老年人的网址导航

老年人常用网址:

http://www.laonian99.com/123/index.htm

我还不算老年人,看了也挺喜欢。哈哈。

hao123马鬼自己!

看网站,不多说。

http://www.hao222.com/

完全一样,就域名改了。留言板还用hao123的。

IsoBuster Pro 2.8 注册码

IsoBuster Pro 2.8 注册码:

www@bkill.com
8499425898728049
E1FA48D1-1B941B3B-ECC69C79-6392F1AC-39EC927E-62F02610-65A81130

公告栏

  • 姓名:林剑锋(不见不散)
  • 来自:中国-广州
  • 简介:潮汕人,出生于广东揭西。醉心于Web开发8年,挑战了一年整体策划和网站运营。目前就职于平成混媒IT部。
  • Email/QQ:admin@ljf.cn

QQ群:设计学院 68075618,网站设计师 9908776

统计

文章:335篇
评论:163条 (2条Spam)
相册:1个 (120张图片)
主题:Nagrand新主题

www.ljf.cn网站PR查询