Raj*_*Das 3 flash actionscript-3
这是我在主类中的Flash/AS3中的代码.
addEventListener(Event.ENTER_FRAME,function(e:Event){
if(findObject == true){
// I want to remove this ENTER FRAME
}
});
Run Code Online (Sandbox Code Playgroud)
mgr*_*aph 13
试试这个:
e.currentTarget.removeEventListener(e.type, arguments.callee)
Run Code Online (Sandbox Code Playgroud)
小智 5
你不应该在上面的代码中做你做的事情.
如果currentTarget事件中没有removeEventListener()方法(可能,但非常不可能),mgraph的代码很可能无法像宣传的那样工作.从编译器的角度来看,虽然您将尝试动态解析一个易于出错的通用对象上的方法,但应小心处理.这是危险的,因为它表明程序员"不知道"她期望通过假设处理和工作的对象是什么样的.假设对于找到解决方案很有帮助,但对于实现解决方案同样不好.
如果你想以你的方式优化某些东西,那么,只是FYI这实际上在符号表(在编译的SWF文件中)中创建了一个唯一的(冗余)名称,这会导致更糟糕的SWF压缩.
如果您在实验中这样做,这很好,但您应该避免在现实生活中的代码.
还有一点需要注意:与true常数的比较是100%无用的.如果这样的比较完全有意义(即findObject可以false随时评估),那么if (findObject) { ... }等同但是代码的缩短版本.最后,希望匿名函数缺少返回类型声明.除了您将收到编译器警告之外,它在您的示例中不会发生太大变化.一般来说,省略类型声明是一种糟糕的风格.
编辑
public function addEventListener(type:String, listener:Function ...):void
{
this._listeners[type].push(listener);
}
public function dispatchEvent(event:Event):void
{
for each (var listener:Function in this._listeners[event.type])
listener(event);
}
public function removeEventListener(type:String, listener:Function, ...):void
{
delete this._listeners[type][listener];
}
Run Code Online (Sandbox Code Playgroud)
假设您实际上想要实现IEventDispatcher(而不是使用另一个EventDispatcher - 您可能有理由这样做,原因之一是本机EventDispatcher生成大量短期对象 - 事件,您可能希望减少它.)但是没有办法,你可以复制你的代码event.target或event.currentTurget,因为你不能访问拥有该方法的对象,所以,你会离开这一点.
另一个例子:
public class SomeEvent extends Event
{
private var _target:NotEventDispatcher;
public function SomeEvent(type:String, someTarget:NotEventDispatcher)
{
super(type);
this._target = someTarget;
}
public override function get target():Object
{
return this._target;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我在现实世界中实际看到的东西,这在Mate或类似框架中用于"匿名"将所有事件调度程序连接到某个"母舰事件调度程序"的单个静态实例.
我不一定证明这种方法是合理的,但从技术上讲,没有什么能阻止你做其中任何一种方法.我在上面的帖子中说的是,在某些情况下,语言会向你承诺,例如,如果你这样做:
var dispatcher:IEventDispatcher;
try
{
dispatcher = IEventDispatcher(event.currentTarget);
// now you can be sure this object has removeEventListener
dispatcher.removeEventListener(event.type, arguments.callee);
}
catch (error:Error)
{
// but what are you going to do here?
}
Run Code Online (Sandbox Code Playgroud)
但最常见的情况是你订阅冒泡事件,在这种情况下,你不知道你是否要取消订阅event.target或event.currentTtarget - 因为你不知道你在听哪一个至.
| 归档时间: |
|
| 查看次数: |
4523 次 |
| 最近记录: |