第一次在这里发帖。我正在使用循环来创建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");
}
答案 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编程的优秀惯例。