AS3下的removeEventListener的使用困惑

神之左手 2014-06-17 04:12:19
在使用AS3中给相关事件绑定相关代码时候 我们一般使用
object.addEventListener(MouseEvent.CLICK, goClick);
其中goClick为事件触发调用的函数名称

但实际需求中更多不仅是要在事件发生时执行函数,也需要对该函数传递相关参数,网上的资料也讲的很清楚,用法如下
object.addEventListener(MouseEvent.CLICK, function(){ goClick(参数);});

本身自己搞JS比较多,所以非常熟悉这样的写法
好了 到这里似乎没有什么问题
下面用到的事件取消的写法 问题就来了

一般取消方式
object.removeEventListener(MouseEvent.CLICK, goClick);
这样就能按需要把对象的鼠标点击事件注销掉

但现在让我比较郁闷的是 按上面带参数的调用方法,应该如何取消,至少我写成
object.removeEventListener(MouseEvent.CLICK, goClick);
或者
object.removeEventListener(MouseEvent.CLICK, function(){ goClick(参数);});
都无法达到注销事件的目的

想问下各位, 实际应该怎么写注销事件绑定的带参数的函数?
...全文
540 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
神之左手 2014-07-01
  • 打赏
  • 举报
回复
自己前阵子把问题解决了,现把解决方案放到下面,希望对有同样问题的朋友有帮助 其实AS和JS都遵从于ECMA那个什么标准,所以有些地方的语言特点是相通的,比如 arguments的关键字,在JS中一般用作是遍历函数中调用语句传递的参数,这里的解决方法也是用这个关键字(对象),其中一个属性是callee,完整的写法应该是 arguments.callee 就是表示该函数对象,例如 ---- javascript ----

var a;
function test(i){
	a = arguments.callee;
	document.write(i);
}

test("10");
a("20");
如上,a本身存放函数test对象,所以可以直接调用,但注意,没有运行第一次的test("10")的话,就调用a("20")是无显示内容的,因为a此时还未被赋值test函数对象。 所以如上,AS中其实也可以用callee来实现,并且基本和JS中没有区别,基本实例代码如下 ---- ActionScript ---- Main.as

package  {
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.events.Event;
	
	public class Main extends Sprite{
		public var sp:Sprite = new Sprite();
		public var sg:Boolean = false;  //用于记录当前是否在旋转
		public var okf:Function;    //用于存放需要被remove的函数对象
		
		public function Main() {
			// 构建一个矩形sprite
			sp.graphics.lineStyle(1,0x000000);
			sp.graphics.beginFill(0xffeeee);
			sp.graphics.drawRect(-50,-30,100,60);
			sp.graphics.endFill();
			addChild(sp);
			sp.x = 200;
			sp.y = 150;
			//为这个对象绑定click事件
			sp.addEventListener(MouseEvent.CLICK, goClick);
		}
		
		private function goClick(e:MouseEvent){
			if (sg == true){
				sg = false;
				this.removeEventListener(Event.ENTER_FRAME, okf);
			}else{
				sg = true;
				var per:int = Math.ceil(Math.random()*10);
				this.addEventListener(Event.ENTER_FRAME, function(e:Event){ goClick2(e, per, arguments.callee);});
			}
		}
		
		private function goClick2(e:Event, per:int, callee:Function){
			sp.rotation += per;
			okf = callee;
		}
	}	
}

10,606

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 其他
社区管理员
  • 其他
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧