2009-09-04 77 views
0

第一次在這裏發佈。我使用循環來創建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"); 
} 

回答

3

我想補充的按鈕數組廣告獲得這樣:

外循環:

​​

在循環:

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

這應該在循環之外,如果你想自定義功能添加到一個按鈕來完成。命名該對象不會爲您提供名稱爲實例的對象。要像上面那樣訪問它,您需要使用:

var button1:NavButton 

這將允許您按照您的操作進行訪問。使用名稱屬性,你可以使用諸如:

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

我強烈建議不要使用匿名函數作爲事件監聽器。而是使用命名函數和事件的target屬性:

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

雖然與匿名函數它可能(可能會)功能,這將是如此容易得多,如果你使用命名功能進行調試。

另外,在你的vars中使用$通常是AS3中不好的形式。 Here's the Flex SDK Standards,這是所有AS3編程的優秀慣例。

+0

太棒了!這工作thx:D 而thx的小費關於函數名稱和VAR命名太... – 2009-09-04 20:18:41