单击In as3后禁用按钮

时间:2016-07-04 16:44:06

标签: actionscript-3 flash

我对as3很新,并试图寻找我的问题的答案,但似乎没有任何作用。我有一个xml加载文件,当用户点击正确的选项(4)时,他们得到一个得分点。我点击一次后尝试禁用该按钮但是没有发生这种情况。任何帮助将不胜感激。 这是我的部分。

function setupButtons():void {
    for (var obj:Object in buttons)
    {
        buttons[obj].addEventListener(MouseEvent.CLICK, checkAnswer);
    }   
        buttons[obj].addEventListener(MouseEvent.MOUSE_UP,disableBtns);
}

function disableBtns(evt:MouseEvent):void {
    for (var obj:Object in buttons)
    evt.currentTarget.removeEventListener(MouseEvent.MOUSE_UP,disableBtns);
    buttons[obj].enabled = false;
}

1 个答案:

答案 0 :(得分:2)

以下是原始代码旁边的一些注释,以帮助解释可能发生的情况:

function setupButtons():void {
    //you're adding a click listener for every object in `buttons`
    for (var obj:Object in buttons)
    {
        buttons[obj].addEventListener(MouseEvent.CLICK, checkAnswer);
    }   

    //this next line seems out of place, 
    //it is NOT a part of your for loop above so it will only run once, 
    //The value of obj will be the LAST item in the for loop above

    buttons[obj].addEventListener(MouseEvent.MOUSE_UP,disableBtns);
}

function disableBtns(evt:MouseEvent):void {
    //you don't have curly braces on this next for loop line
    //this means it's only going to run the line immediately following the loop as part of the loop.
    for (var obj:Object in buttons)
    //your attempting to remove the same listener over and over again (since this line is in a loop)
    evt.currentTarget.removeEventListener(MouseEvent.MOUSE_UP,disableBtns);
    //this next line is not part of the loop above. 
    //I imagine you only want to disable the button that was clicked (evt.currentTarget)
    //This will only disable whatever the last value of obj was in the loop above
    buttons[obj].enabled = false;
}

现在,这是一个简单的代码重构,可能会有所帮助:

//first, just have one click listener for each button, forget the mouse up listener
function setupButtons():void {
    for (var obj:Object in buttons){
        buttons[obj].addEventListener(MouseEvent.CLICK, btnClick);
    }
}

function btnClick(evt:MouseEvent):void {
    //If buttons are of the SimpleButton class, you can just disable them
    evt.currentTarget.enabled = false;

    //OR, if the buttons are not of the SimpleButton class
    evt.currentTarget.mouseChildren = false;
    evt.currentTarget.mouseEnabled = false;

    //OR, just remove the click listener
    evt.currentTarget.removeEventListener(MouseEvent.CLICK, btnClick);

    //run the checkAnswer function
    checkAnswer(evt);
}

要在单击任何1时禁用所有按钮,您可以执行以下操作:

function btnClick(evt:MouseEvent):void {
    for (var obj:Object in buttons){
        buttons[obj].removeEventListener(MouseEvent.CLICK, btnClick);
    }

    //run the checkAnswer function
    checkAnswer(evt);
}