这是我的完整代码
import fl.controls.*;
var test:MovieClip = new MovieClip();
var btn:Button;
for(var i:int = 1; i<=7; i++){
btn = new Button();
btn.name = "btn" + i;
btn.x = i * 100;
test.addChild(btn);
btn.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent) { nothing(i); });
}
addChild(test);
function nothing(bla:int):void {
trace("You clicked " + bla);
}
结果:
You clicked 8
You clicked 8
You clicked 8...
无论如何,我可以使用for循环创建不同的名称按钮,并将其添加到事件监听器中吗?
答案 0 :(得分:1)
您的问题是function(evt:MouseEvent){}
closure(JavaScript信息也适用于ActionScript,因为它们都是ECMAScript)。这是你可以做的:
function makeClickListener(i:int) {
return function(evt:MouseEvent) {
nothing(i);
};
}
...
for(...) {
...
btn.addEventListener(MouseEvent.CLICK, makeClickListener(i));
}
答案 1 :(得分:0)
在你的例子中你的i没有做你认为它正在做的事情。你已经将它声明为一个全局变量,并且在你正在做的事情中传入函数是没有意义的。最后,您的按钮只是报告i的当前值(循环后总是为8)。
我喜欢所提供的其他解决方案,但这里有一个更面向对象的解决方案,根据您对按钮(或将来的其他对象)的操作,这可能会有所帮助。
public class MyButton extends Button{
public var myIndex:Number;
}
现在你使用MyButton而不是Button,并在你的循环中抛出
btn.myIndex = i;
然后附加通用事件处理程序
btn.addEventListener(MouseEvent.CLICK, myHandler);
看起来像这样:
function myHandler(evt:MouseEvent){
trace(evt.target.myIndex);
}
请参阅...事件的目标始终是您附加事件的对象。对于那个对象,您应该附加您希望保留的任何值。我个人更喜欢这种方法,因为那时信息与对象有关(并且可以被其他可能需要它的元素使用),而不是在处理程序中,只在处理程序中。
答案 2 :(得分:0)
var test:MovieClip = new MovieClip();
var btn:Button;
for(var i:int = 1; i<=7; i++){
btn = new Button();
btn.name = i.toString();
btn.x = i * 100;
test.addChild(btn);
btn.addEventListener(MouseEvent.CLICK, nothing);
}
function nothing(event:MouseEvent):void {
//trace("You clicked " + int( event.currentTarget.name ) );
trace("You clicked " + event.currentTarget.name );
}