请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博
点点网模板设计大赛 phpchina

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 用悬赏 三天解决问题 解决访问速度慢 论坛支持农历生日 - 给官方提建议

论坛活动及任务 归纳网站最新活动 地图任务 邮件更新任务:保护帐号安全

积分换实物,来参加蓝色理想积分兑换吧! 联系招聘客服 蓝色理想帮你找工作! 万元奖励等你拿——点点网模板设计大赛

查看: 5322|回复: 13

[AS1&2] 关于Mouse的onMouseDown事件 [复制链接]

k5angle 楼主

DFdou

银牌会员 手机认证 

帖子
913
体力
1956
威望
5
居住地
浙江省 杭州市
发表于 2008-9-18 16:49:47 |显示全部楼层
有2个swf文件swf1跟swf2,swf1里边有个按钮时加载swf2的,
swf1的代码如下:
btn.onRelease=function(){
        mc.loadMovie("swf2.swf");
        }
swf2的代码是
var mouseListener:Object = new Object();
mouseListener.onMouseDown= function() {
        trace("1111111111111");
};
Mouse.addListener(mouseListener);
想要时间的效果是在swf1里加载swf2.swf后每次按下鼠标就trace 1111111111111,但是有个问题
如果多次点击(假设是N次)btn加载swf2.swf的话,swf1里边按一次鼠标会trace出来N个1111111111111;
求助,怎么解决这个问题?
西部数码顶级域名注册商39元抢注!
k5angle 楼主

DFdou

银牌会员 手机认证 

帖子
913
体力
1956
威望
5
居住地
浙江省 杭州市
发表于 2008-9-18 17:05:44 |显示全部楼层
高手都去吃饭了……
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

帖子
103
体力
181
威望
0
居住地
重庆市 渝中区
发表于 2008-9-18 17:54:00 |显示全部楼层
关注下这个问题

使用道具 举报

帖子
281
体力
411
威望
5
居住地
广东省 广州市
发表于 2008-9-18 19:17:12 |显示全部楼层
我想你是想加载是想加载swf2后只要按下鼠标就输出一次
为什么不直接将
var mouseListener:Object = new Object();
mouseListener.onMouseDown= function() {
       trace("1111111111111");
};
Mouse.addListener(mouseListener);
写在swf1中呢
那么你就能够达到这样的结果

不过你说的现象真的很奇怪,是不是as2的漏洞
提供各种图书资料、需要的话可以联系本人!

使用道具 举报

sunxinzhe

银牌会员

帖子
421
体力
1375
威望
6
居住地
广东省 深圳市
发表于 2008-9-18 21:01:49 |显示全部楼层
一登陆就看到这个东西
确实很怪,我试过remove再重载,结果一样

使用道具 举报

k5angle 楼主

DFdou

银牌会员 手机认证 

帖子
913
体力
1956
威望
5
居住地
浙江省 杭州市
发表于 2008-9-19 13:24:28 |显示全部楼层
其实要加载的swf2是独立的一个swf文件,里边有很多东西,而swf1是加载用的容器,所以写在一起不太好。

昨天在网上搜来搜去,找不到解决这个问题的办法……
继续关注

使用道具 举报

libins 

湘农青年

版主 手机认证 

帖子
4762
体力
7293
威望
11
居住地
广东省 广州市
发表于 2008-9-19 14:15:53 |显示全部楼层
  1. btn.onRelease = function() {
  2.         if (mc._height>0) {
  3.                 mc.unloadMovie("2.swf");
  4.                 trace(_root.mc.mouseListener);
  5.                 Mouse.removeListener(mc.mouseListener);
  6.         } else {
  7.                 mc.loadMovie("2.swf");
  8.         }
  9. };
复制代码

将那个容器的代码改为这样的

建议看看这个说明:
  1. 合理地管理事件。在调用侦听器之前,通过使用条件来检查侦听器是否存在(不为 null),从而保持事件侦听器数组的紧凑性。通过调用 clearInterval 来清除任何活动间隔,并通过调用 removeListener 来删除任何活动侦听器之后,再使用 unloadapplication 或 removeapplicationClip 删除内容。在卸载影片剪辑时,如果任何 ActionScript 函数仍引用 SWF 数据,则 Flash 不会回收 SWF 数据内存(例如,从间隔和侦听器回收)。

  2. 当不再需要变量时,请将其删除或将其设置为 null,这会对其进行标记以便进行垃圾回收。由于删除变量的操作可从 SWF 文件中删除不需要的资源,因而有助于在运行时优化内存使用。删除变量比将变量设置为 null 更好。

  3. 在进行垃圾回收之前,可通过调用 removeListener 从对象中显式删除侦听器。
复制代码


之前有朋友说了,删除了影片还是会这样,是因为鼠标还在帧听那个Object:mouseListener,所以并没有把所删除的这个mouseListener清除,而没调用一次,都var mouseListener了一个Object出来,所以看到“11111111”这个也就越来越多。

开始我也想到了是内存中这个mouseListener变量搞得鬼,手动delete mouseListener,也是没有作用的,后来查看了资料,说如果还有AS引用这个变量的话,虽然可以删除,但是还是可以应用的到:
  1. btn.onRelease = function() {
  2.         if (mc._height>0) {
  3.                 mc.unloadMovie("2.swf");
  4.                 delete _root.mc.mouseListener
  5.                 trace("1:"+_root.mc.mouseListener);// trace为1:undefined
  6.         } else {
  7.                 mc.loadMovie("2.swf");
  8.         }
  9. };
  10. //但是如果点击鼠标的话,还是会显示多个11111
复制代码

所以只能通过removeListener来实现,当removeListener完后,没有AS引用这个mouseListener这个Object的话,flash就会清楚这个变量

对于这种问题,大家应该看看flash垃圾回收方面的资料~

使用道具 举报

sunxinzhe

银牌会员

帖子
421
体力
1375
威望
6
居住地
广东省 深圳市
发表于 2008-9-19 14:23:51 |显示全部楼层
原来如此

使用道具 举报

k5angle 楼主

DFdou

银牌会员 手机认证 

帖子
913
体力
1956
威望
5
居住地
浙江省 杭州市
发表于 2008-9-19 15:56:30 |显示全部楼层
btn.onRelease = function() {
    if (mc._height>0) {
        mc.unloadMovie("2.swf");
        trace(_root.mc.mouseListener);
        Mouse.removeListener(mc.mouseListener);
    } else {
        mc.loadMovie("2.swf");
    }
};
多谢libins兄哈,以后得多看看这方面的资料才是

使用道具 举报

k5angle 楼主

DFdou

银牌会员 手机认证 

帖子
913
体力
1956
威望
5
居住地
浙江省 杭州市
发表于 2008-9-19 16:15:40 |显示全部楼层
对了,每次加载swf2,在swf2里都会var一个变量mouseListener,如果没有removeListener(mc.mouseListener)会产生多个mouseListener,
这问题就出现了,一个flash里头可以存在多个名为mouseListener的Object?

使用道具 举报

libins 

湘农青年

版主 手机认证 

帖子
4762
体力
7293
威望
11
居住地
广东省 广州市
发表于 2008-9-19 17:40:29 |显示全部楼层
这个就属于内存的处理范围了,AS2的话按理说应该可以无限的,貌似内存存储变量是可以按mouseListener*N这种方式来的(忘记在哪看了,不确定)。

LZ去我博客,看下AS3的垃圾回收:
http://hi.baidu.com/nscartoon/bl ... 29cedaa9ec9a52.html

使用道具 举报

帖子
281
体力
411
威望
5
居住地
广东省 广州市
发表于 2008-9-19 18:23:40 |显示全部楼层
真是奇怪
我在swf2中设置变量
发现一个奇怪的现象
刚好单击一次,变量增加一
然后输出也比上次单击多一条数吃
第一次输出 就输出1条
第二次单击 就输出2条
第三次单击 就输出3条
.
.
.

第N次单击 就输出N条


看来flash莫名其妙的东西还真多呀
提供各种图书资料、需要的话可以联系本人!

使用道具 举报

帖子
103
体力
181
威望
0
居住地
重庆市 渝中区
发表于 2008-9-19 19:35:53 |显示全部楼层
研究下

使用道具 举报

k5angle 楼主

DFdou

银牌会员 手机认证 

帖子
913
体力
1956
威望
5
居住地
浙江省 杭州市
发表于 2008-9-21 12:57:49 |显示全部楼层
原帖由 libins 于 2008-9-19 17:40 发表
这个就属于内存的处理范围了,AS2的话按理说应该可以无限的,貌似内存存储变量是可以按mouseListener*N这种方式来的(忘记在哪看了,不确定)。

LZ去我博客,看下AS3的垃圾回收:
http://hi.baidu.com/nscartoon/b ...


呵呵 多谢分享 学习中

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|安久科技提供CDN|blueidea.com ( 京ICP备05002321号 )  

GMT+8, 2012-2-9 14:17 , Processed in 0.079483 second(s), 8 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部