2014-02-25 2 views
0

IT- 클래스에서 과제를위한 간단한 계산기를 만들고 있습니다. 그것은 사용자가 자신의 숫자를 추가 할 수있는 3 개의 텍스트 박스를 가지고 있으며, 박스는 사용자가 숫자를 여기에 써야한다고 표시하기 위해 그 안에 "0"으로 시작합니다. 내가하고 싶은 것은 사용자가 상자에 초점을 맞추면이 제로가 사라지게하는 것입니다.배열을 통해 결정된 객체에서 EventListener 제거

3 개의 상자가 있기 때문에 동일한 코드를 3 번 ​​쓰는 대신 EventListener가 텍스트와 EventListener를 제거하는 함수를 호출하도록하고 싶습니다.

다른 텍스트 상자가 포함 된 배열을 사용하여 해당 텍스트를 호출하고 원하는대로 텍스트를 변경했지만 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)); 


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

답변

0

, 당신은 때 removeEventListener의 PARAM 내 onfocus 및 (i)를 호출 할 때, 당신은 반환되기 때문에 새로운 기능 :

당신은 target 재산 FocusEvent 클래스의 사용 시도 할 수 있습니다 원래 이벤트에 의해 트리거 된 기능은 아닙니다. 코드의 또 다른 문제점은 'i'가 선언 한 리스너 함수에 존재하지 않는다는 것입니다. evt의 속성 만 사용하여 대상 텍스트 필드와 제거 할 올바른 이벤트 수신기를 알아야합니다.

이 작업을 수행하는 일반적인/올바른 방법은 이벤트 수신 함수를 사용하여 각 텍스트 필드를 수신하는 것입니다. 다른 용도로 사용하지 않으면 배열이 더 이상 필요하지 않습니다.

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); 
+0

감사합니다. 내 설명이 모든 것을 해결했습니다. – user3351024

+0

질문 : 'removeEventListener'라인에서 왜 'onFocusIn'대신 'onFocusEvent'수신기 기능이 있습니까? – Craig

+0

주의 해 주셔서 감사합니다. 오타 였어. 나는 그것을 고쳤다. – mfa

0

리스너가 제거되지 않습니다 때문에 호출 할 때마다 새로운 Function 인스턴스 onFocus 돌아갑니다.

귀하의 이벤트 리스너가 제거되지 않는
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); 
관련 문제