我不是代码天才,而是动作脚本的粉丝。 你能帮我解决这个问题:
我有一个函数,根据所选对象,将调用事件监听器到一组已经在舞台上的“子项”(我想在点击时重复使用这个子项和更改的参数,而不是创建多个实例和几个代码)。
因此,对于每个选定的“案例”,我必须将不同的变量传递给那些“子项”,如下所示:
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);
有人帮我吗? 非常感谢提前。 :)
答案 0 :(得分: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);
}
}
答案 1 :(得分:0)
你的问题很模糊;什么&#34;变量&#34;你想&#34;通过&#34;?那是什么意思&#34;将变量传递给子项&#34;?通常&#34;通过&#34;意味着调用一个函数。
如果您可以更具体地了解您尝试做什么,那将会有所帮助。与此同时,这里有三件事可以达到你想要的目的:
您可以使用括号表示法获取任何对象的任何成员。
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
参数),您可以编写一些非常灵活的代码。动态代码确实具有性能成本,但只要呼叫频率为每秒几百次或更少,您就不会注意到差异。