从通过Array决定的对象中删除EventListener

时间:2014-02-25 11:56:52

标签: actionscript-3 flash events event-listener

我正在为我的IT-Class中的作业制作一个简单的计算器。它有3个文本框,用户可以在其中添加他的数字,并且框内部以“0”开头,以显示用户应该在这里写数字。我想做的是,当用户把注意力集中在盒子上时,这个零消失了。

由于我有3个框,我想让EventListener调用一个删除文本和Eventlistener的函数,而不是编写相同的代码3次。

使用包含不同文本框的数组,我设法调用它们,并根据需要更改文本,但不删除EventListener,因此当用户关注文本框时,用户写入的文本将被删除再次

///////////////////////////////////////////////////////////////////////////////////
//The Array containing all the TextFields
var textFieldArr:Array = new Array(txtNumber1,txtNumber2,txtNumber2)

function onFocus(i:int){
    return function (evt:FocusEvent){
        textFieldArr[i].text = "";
        textFieldArr[i].removeEventListener(FocusEvent.FOCUS_IN, onFocus(i))
    }
}

//Calls up the onFocus function and declares variable i
txtNumber1.addEventListener(FocusEvent.FOCUS_IN, onFocus(0));
txtNumber2.addEventListener(FocusEvent.FOCUS_IN, onFocus(1));
txtNumber3.addEventListener(FocusEvent.FOCUS_IN, onFocus(2));


///////////////////////////////////////////////////////////////////////////////

2 个答案:

答案 0 :(得分:0)

不会删除侦听器,因为onFocus会在每个调用新Function实例时返回。

您可以尝试使用target类的FocusEvent属性:

var textFieldArr:Array = new Array(txtNumber1,txtNumber2,txtNumber2)

function onFocus(evt:FocusEvent){
    TextField(evt.target).text = "";
    TextField(evt.target).removeEventListener(FocusEvent.FOCUS_IN, onFocus)
}

//Calls up the onFocus function and declares variable i
txtNumber1.addEventListener(FocusEvent.FOCUS_IN, onFocus);
txtNumber2.addEventListener(FocusEvent.FOCUS_IN, onFocus);
txtNumber3.addEventListener(FocusEvent.FOCUS_IN, onFocus);

答案 1 :(得分:0)

您的事件侦听器未被删除,因为当您在removeEventListener参数中调用onFocus(i)时,您将返回一个新函数,而不是最初由该事件触发的函数。您的代码的另一个问题是,您声明的侦听器函数中不存在“i” - 您只需要使用evt的属性来确定要定位的文本字段以及要删除的正确事件侦听器。 / p>

执行此操作的常见/正确方法是使用事件接受函数,并使用它来侦听每个文本字段。除非你有其他用途,否则你甚至不再需要这个数组。

function onFocusIn(evt:FocusEvent):void{
    trace("onFocusIn("+evt.target+")");
    var focusedField:TextField = TextField(evt.target);
    if(focusedField){
        focusedField.text = "";
        focusedField.removeEventListener(FocusEvent.FOCUS_IN, onFocusIn);
    }
}

txtNumber1.addEventListener(FocusEvent.FOCUS_IN, onFocusIn);
txtNumber2.addEventListener(FocusEvent.FOCUS_IN, onFocusIn);
txtNumber3.addEventListener(FocusEvent.FOCUS_IN, onFocusIn);