3

我不是代码天才,而是动作脚本的粉丝。你能帮我解决这个问题吗:

我有一个函数,根据选择的对象,将事件侦听器调用到已经在舞台上的一组“子项目”(我想在单击时重用这些更改参数的子项目,而不是创建几个实例和几个代码)。

因此,对于每个选定的“案例”,我必须将不同的变量传递给那些“子项目”,如下所示:

function fooMenu(event:MouseEvent):void {
    switch (event.currentTarget.name)
    {
        case "btUa1" :
            trace(event.currentTarget.name);
            // a bunch of code goes here
            //(just cleaned to easy the view)
            /*
            HELP HERE <--
            here is a way to pass the variables to those subitems
            */

            break;
    }
}

function fooSub(event:MouseEvent):void
{
    trace(event.target.data);
    trace(event.currentTarget.name);
    // HELP PLEASE <-> How can I access the variables that I need here ?
}

btUa1.addEventListener(MouseEvent.CLICK, fooMenu);
btUa2.addEventListener(MouseEvent.CLICK, fooMenu);

btTextos.addEventListener(MouseEvent.CLICK, fooSub);
btLegislacao.addEventListener(MouseEvent.CLICK, fooSub);

有人帮我吗?非常感谢提前。:)

4

2 回答 2

1

(我不确定我的问题是否正确,而且我已经有一段时间没有在 AS3 中开发了。)

如果您想简单地创建带有将在单击(或其他事件)时调用的参数的函数,您可以简单地使用它:

btUa1.addEventListener(MouseEvent.CLICK, function() {
  fooMenu(parameters);
});

btUa2.addEventListener(MouseEvent.CLICK, function() {
  fooMenu(other_parameters)
}):

public function fooMenu(...rest):void {
  for(var i:uint = 0; i < rest.length; i++)
  {
     // creating elements
  }
}

如果你想调用分配给其他东西的事件监听器,你可以使用 DispatchEvent

btnTextos.dispatchEvent(new MouseEvent(MouseEvent.CLICK))

请记住,您不能使用 btTextos.addEventListener(MouseEvent.CLICK, carregaConteudo("jocasta")); 因为您在添加 Eventlistener 时传递的第二个参数将被视为函数本身 - 有两种使用 addEventListener 的正确方法:

1:

function doSomething(event:MouseEvent):void
{
  // function code
}
element.addEventListener(MouseEvent.CLICK, doSomething); //notice no brackets

2:

element.addEventListener(MouseEvent.CLICK, function() { // function code });

所以:

function fooSub(event:MouseEvent, bla:String):void 
{ 
trace(event.currentTarget.name+" - "+bla); 
// bla would be a clip name. 
} 

codebtTextos.addEventListener(MouseEvent.CLICK, function(e:MouseEvent) { fooSub(e, "jocasta") } ); 

如果您希望动态生成内容,或者尝试这样的操作:

btUa1.addEventListener(MouseEvent.CLICK, function() {
    createMenu(1);
});

btUa2.addEventListener(MouseEvent.CLICK, function() {
    createMenu(2);
});

function createMenu(id):void
{
    // Switching submenu elements
    switch (id)
    {
        case 1:
            createSubmenu([myFunc1, myFunc2, myFunc3]); // dynamically creating submenus in case you need more of them than u already have
            break;
        case 2:
            createSubmenu([myFunc4, myFunc5, myFunc6, myFunc7]);
            break;
        default:
            [ and so on ..]
    }
}

function createSubmenu(...rest):void {
    for (var i:uint = 0; i < rest.length; i++) 
    {
        var mc:SubItem = new SubItem(); // Subitem should be an MovieClip in library exported for ActionScript
        mc.addEventListener(MouseEvent.CLICK, rest[i] as function)
        mc.x = i * 100;
        mc.y = 0;
        this.addChild(mc);
    }
}
于 2012-07-30T17:12:41.203 回答
0

您的问题相当模糊;你想“通过”什么“变量”?“将变量传递给子项”是什么意思?通常“通过”意味着调用一个函数。

如果您可以更具体地说明您尝试做的事情,那将会有所帮助。与此同时,这里有三件事可能会得到你想要的:

您可以使用括号表示法获取任何对象的任何成员。

var mc:MovieClip = someMovieClip;  
var xVal:Number = mc.x;     // The obvious way
xVal = mc["x"];             // This works too
var propName:String = "x";
xVal = mc[propName] ;       // So does this.

您可以使用变量引用函数

function echo(message:String):void { 
    trace(message); 
}
echo("Hello");                      // The normal way
var f:Function = echo; 
f("Hello");                         // This also works

您可以使用 function.apply 调用具有数组中所有参数的函数

// Extending the above example...
var fArgs:Array = ["Hello"];
f.apply(fArgs);    // This does the same thing

在这三件事之间(以及rest另一张海报提到的参数),您可以编写一些非常灵活的代码。动态代码肯定是以性能为代价的,但只要调用频率为每秒几百次或更少,您就永远不会注意到差异。

于 2012-07-30T17:15:28.083 回答