Actionscript 3 AS3 |与removeListener的问题

Actionscript 3 AS3 |与removeListener的问题,actionscript-3,Actionscript 3,这是我的代码: function startDrawMarker():void { if (isStartDrawMarker!=false) { stage.addEventListener(MouseEvent.MOUSE_DOWN, onDownMarker); } else { stage.removeEventListener(MouseEvent.MOUSE_DOWN, onDownMarker); } } 当“isStart


这是我的代码:

function startDrawMarker():void {
    if (isStartDrawMarker!=false) {
        stage.addEventListener(MouseEvent.MOUSE_DOWN, onDownMarker);
    } else {
        stage.removeEventListener(MouseEvent.MOUSE_DOWN, onDownMarker);
    }
}

当“isStartDrawMarker”为true时,as3添加事件侦听器,但当“isStartDrawMarker”为false时,as3不会删除侦听器。

如果只在
isStartDrawMarker
为true时才要侦听鼠标向下的
,则它将是:

function startDrawMarker():void {
    if (isStartDrawMarker) {
        stage.addEventListener(MouseEvent.MOUSE_DOWN, onDownMarker);
    } else {
        stage.removeEventListener(MouseEvent.MOUSE_DOWN, onDownMarker);
    }
}

很有可能,当你调用“startDrawMarker”和isStartDrawMarker为false时,引用与调用它时的引用不同,并且是true。如果没有按照提供的代码删除侦听器,并且其他所有内容都是正确的,那么您可能希望尝试使用弱侦听器。您还可以通过检查“isStartDrawmarker”是否为true而不是“!=false”,使代码更易于阅读


那么,更改isStartDrawMarker的值将不会调用startDrawMarker方法,这就是为什么^^

使用AS3,您可以在希望添加变量更改行为时创建get/set。 为此,请重命名类变量

public var isStartDrawMarker 

并使用下面的get/set

/**
* get the current value
*/
public function get isStartDrawMarker():Boolean
{
return _isStartDrawMarker;
}

/**
* change the current value AND automatically add/remove a mousedown listener on the stage
*/
public function set isStartDrawMarker(value:Boolean):void
{
    _isStartDrawMarker = value;
    if (_isStartDrawMarker == true) {
        stage.addEventListener(MouseEvent.MOUSE_DOWN, onDownMarker);
    } else {
        stage.removeEventListener(MouseEvent.MOUSE_DOWN, onDownMarker);
    }
}
下面是如何在代码中使用它(请注意,您始终使用isStartDrawMarker而不是\u isStartDrawMarker witch是私有的)


我猜我们需要更多信息来帮助您找出问题所在。使用此实现,您必须:-更改isStartDrawMarker的值-调用startDrawMarker方法来删除/添加侦听器如果您想在一次移动中删除/添加侦听器我在下面添加了一个很长的答案另一个解决方案是删除onDownMarkerMouseEvent.MOUSE\u UP事件上的侦听器^^
private var _isStartDrawMarker
/**
* get the current value
*/
public function get isStartDrawMarker():Boolean
{
return _isStartDrawMarker;
}

/**
* change the current value AND automatically add/remove a mousedown listener on the stage
*/
public function set isStartDrawMarker(value:Boolean):void
{
    _isStartDrawMarker = value;
    if (_isStartDrawMarker == true) {
        stage.addEventListener(MouseEvent.MOUSE_DOWN, onDownMarker);
    } else {
        stage.removeEventListener(MouseEvent.MOUSE_DOWN, onDownMarker);
    }
}
this.isStartDrawMarker = true; // will set to true AND add the listener
this.isStartDrawMarker = false; // will set to false AND remove the listener
myClass.isStartDrawMarker = true; // will set to true AND add the listener
myClass.isStartDrawMarker = false; // will set to false AND remove the listener