我来自php jquery背景,我目前正在处理flash as3,不知道如何将值传递给eventlistner函数,说我有以下内容。
for (var i:uint = 0; i < asteroids.length; i++)
{
asteroids[i].x = Math.random() * 450;
asteroids[i].y = Math.random() * 450;
asteroids[i].addEventListener(MouseEvent.MOUSE_UP, changeValue);
}
public function changeValue(event:MouseEvent):void
{
playSound(anote);
trace(event.currentTarget);
}
我在循环中的addeventlistner的每个小行星我需要将不同的值传递给var anote函数吗?
jquery我愿意。
$(".asteroids").click(function() {
// or something similar
var anote = $(this).attr('href');
playSound(anote);
return false;
});
有人能指出我正确的方向。
答案 0 :(得分:2)
我建议为你的Asteroid实例创建一个类(假设它是asteroids
数组中的内容)。每个小行星都可能具有anote
属性,其值不同(这会严重反映您的.asteroids
元素href
属性。
public class Asteroid extends Sprite
{
public var anote:String = "";
}
然后:
for each(var i:Asteroid in asteroids)
{
i.x = Math.random() * 450;
i.y = Math.random() * 450;
i.addEventListener(MouseEvent.MOUSE_UP, changeValue);
}
public function changeValue(event:MouseEvent):void
{
playSound((event.currentTarget as Asteroid).anote);
}
理想情况下,您的Asteroid类还会包含示例中的代码,并引用任何类处理playSound()
方法。
另一个选项是使用anote
属性创建自己的事件类,您可以在调度和使用时设置该属性。这个过程非常冗长,所以这里是我以前的一个答案的链接,并深入解释了实现这个问题:
答案 1 :(得分:1)
我发现最简单的方法是在addEventListener
行中创建一个函数:
for (var i:uint = 0; i < asteroids.length; i++)
{
asteroids[i].x = Math.random() * 450;
asteroids[i].y = Math.random() * 450;
asteroids[i].addEventListener(MouseEvent.MOUSE_UP, function(e:MouseEvent){
changeValue(e, otherArguments);
});
}
public function changeValue(event:MouseEvent, otherArguments:Object):void
{
playSound(anote);
trace(event.currentTarget);
}
基本上,您创建了一个包装函数,可以将您需要的任何参数传递给事件侦听器函数。
实现此目的的另一种方法是创建自己的扩展MouseEvent
的类并使用它,但这更复杂。
答案 2 :(得分:1)
每次为对象或事件编写一个新类很麻烦,并且使用匿名函数也不稳定。只需在变量中抓取它:
var listeners:Object = new Object();
for (var i:uint = 0; i < asteroids.length; i++) {
asteroids[i].x = Math.random() * 450;
asteroids[i].y = Math.random() * 450;
listeners[i] = changeValue(asteroids[i].anote);
asteroids[i].addEventListener(MouseEvent.MOUSE_UP, listeners[i]);
}
public function changeValue(anote:Sound):Function {
return function(event:MouseEvent):void {
playSound(anote);
trace(event.currentTarget);
}
}
然后,稍后删除侦听器:
for (i = 0; i < asteroids.length; i++) {
//trace("asteroid" + i + " (before): " + asteroids[i].hasEventListener(MouseEvent.MOUSE_UP));
asteroids[i].removeEventListener(MouseEvent.MOUSE_UP, listeners[i]);
//trace("asteroid" + i + " (after): " + asteroids[i].hasEventListener(MouseEvent.MOUSE_UP));
}
关于该问题,请参阅this answer。