如何为每个按钮动态创建按钮操作

时间:2009-09-04 19:40:49

标签: flash actionscript-3

第一次在这里发帖。我正在使用循环来创建3个按钮,但我的问题是将按钮操作分配给每个按钮。我的按钮监听器/动作代码仅适用于创建的最后一个按钮:(

我尝试按照我给他们的名字来定位按钮($ navButton.name =“button”+ i)但是这会为button1抛出一个未定义的错误。

任何帮助将不胜感激,我是AS3菜鸟:“(

function createNav(){

    for (var i:Number = 0; i < myXMLArray.length; i++)
    {
        $navButton = new NavButton();
        $navButton.name = "button" +i;
        $navButton.x = i * (SIZE + SPACING);
        $navButton.y = 179;
        addChild($navButton);
        trace("$navButton.name = "+$navButton.name);
        trace("button 1 = "+button1);

        //trying to give the 3 buttons a simple rollover/click action:

        $navButton.buttonMode = $navButton.buttonMode = true;
        $navButton.addEventListener(MouseEvent.MOUSE_UP, navAction);
        $navButton.addEventListener(MouseEvent.ROLL_OVER, function() {$navButton.nextFrame();});
        $navButton.addEventListener(MouseEvent.ROLL_OUT, function() {$navButton.prevFrame();});


        //thought I could control via calling the $navButton.name
        //button1.addEventListener(MouseEvent.MOUSE_UP, navAction);
        //button1.addEventListener(MouseEvent.ROLL_OVER, function() {button1.nextFrame();});
        //button1.addEventListener(MouseEvent.ROLL_OUT, function() {button1.prevFrame();});


        /*var traceText:TextField = new TextField();
        traceText.defaultTextFormat = a12;
        traceText.x = i * (SIZE + SPACING);
        traceText.y = 181;
        traceText.width = 116;
        traceText.height = 20;
        traceText.text = myXMLArray[i].id;
        addChild(traceText);*/
    }

}

function navAction()
{

    trace("click");
}

1 个答案:

答案 0 :(得分:3)

我会将按钮添加到数组广告访问中:

在循环之外:

var buttons:Array = []

在循环中:

buttons.push(navButton)
buttons[1].addEventListener(MouseEvent.MOUSE_UP, navAction);

如果您尝试将自定义功能添加到单个按钮,则应在循环外部执行此操作。命名对象不会为您提供具有实例名称的对象。要像上面那样访问它,您需要使用:

var button1:NavButton

这将允许您像以前一样访问。使用name属性可以使用如下内容:

if(navButton.name == "button1")
    navButton.addEventListener(Event.BLAHBLAH, DoStuff);

我强烈建议您不要使用匿名函数作为事件侦听器。而是使用命名函数和事件的目标属性:

function handleButtonClick(event:MouseEvent):void
{
    var button:NavButton = event.target as NavButton;
    if(button)
        button.nextFrame()
}

虽然它可能(可能会)使用匿名函数,但如果使用命名函数,它将更容易调试。

顺便说一句,在AS3中使用$代表你的vars通常是不好的形式。 Here's the Flex SDK Standards,这是所有AS3编程的优秀惯例。