我无法使用onRollOver来实现这个For循环。
for (var i:Number = 1; i<=4; i++) {
this['videobutton'+i].onRollOver = function() {
trace(i);
this['stream'+i].pause(false);
this['video'+i].attachVideo(this['stream'+i]);
fadeIn(this['video'+i]);
};
}
它认为它与变量范围和i有关,但我不知道如何解决它。
跟踪给了我:5
有什么想法吗?
这是源文件: http://drop.io/gqdcyp3
更新的
我自己解决了,但我认为这不是最佳解决方案:
var videos:Array = new Array(
'ltp_video-low1.flv',
'ltp_video-low1.flv',
'ltp_video-low1.flv',
'ltp_video-low1.flv'
);
function videoOver(buttonMC,video,stream) {
buttonMC.onRollOver = function() {
stream.pause(false);
video.attachVideo(stream);
fadeIn(video);
};
}
function videoOut(buttonMC,video,stream) {
buttonMC.onRollOut = function() {
fadeOut(video);
stream.pause();
};
}
for (var i:Number=1; i<=4; i++) {
this['connection'+i] = new NetConnection();
this['connection'+i].connect(null);
this['stream'+i] = new NetStream(this['connection'+i]);
this['stream'+i].play(videos[i-1]);
videoOver(this['videobutton'+i],this['video'+i],this['stream'+i]);
videoOut(this['videobutton'+i],this['video'+i],this['stream'+i]);
}
无论如何,这是有效的。但是如果有人可以给我一个由此创建的解决方案,那就好了,因为它有效。如何在循环中使用这些函数?
答案 0 :(得分:1)
之前我没有对Flash做过任何事情,但看起来变量i
正在closed over。翻转处理程序内的代码仅在翻转时执行,此时评估i
;不是在定义函数时。
通过在另一个函数中创建处理函数,每个处理程序应该获得自己的i
:
for (var i:Number = 1; i<=4; i++) {
this['videobutton'+i].onRollOver = MakeRollOverHandler(i);
}
function MakeRollOverHandler(i:Number)
{
return function() {
trace(i);
this['stream'+i].pause(false);
this['video'+i].attachVideo(this['stream'+i]);
fadeIn(this['video'+i]);
};
}
你可能不得不调整ActionScript的语法,但是假设函数参数是按值传递的,那么一般的想法应该是合理的。每次调用MakeRollOverHandler都会创建一个不同的i
。
我从ActionScript文档中注意到onRollOver没有提供有关触发事件的按钮的任何信息。这是一种耻辱,因为如果它确实你可以使用该信息选择适当的字段集。
答案 1 :(得分:1)
trace(i)
虽然我把它扩展了一点(“i:”+ i +“this.ID:”+ thishisID) 你将永远得到5,因为虽然我是1-4循环,循环已经完成,按下按钮后“i”仍为5(我有点不确定为什么它是5而不是4 ...)。我发现在这种情况下向movieClip添加ID字段是一种很好的做法。
使用令牌访问器访问ID(我认为这就是所谓的),因为它不是MovieClip类的本机属性(我猜测“videobutton”是由MovieClip制作的)
for (var i:Number = 1; i<=4; i++) {
this['videobutton'+i]["ID"]=i
this['videobutton'+i].onRollOver = function() {
trace("i:"+i+" this['ID']:"+this["ID"]);
this['stream'+this["ID"]].pause(false);
this['video'+this["ID"]].attachVideo(this['stream'+this["ID"]]);
fadeIn(this['video'+this["ID"]]);
}
}
我希望这有效......如果没有,请继续发帖!
答案 2 :(得分:1)
你需要在每个id
movieClip中定义一个变量,比如说videobutton
。与i
不同,这些变量对每个按钮都有不同的值。然后,您不再在onRollOver函数中使用this.i
,而是使用this.id
。
此外,因为onRollOver在每个视频按钮上运行,所以函数内的this
指向视频按钮,而不是指向舞台。
新代码将是:
for (var i:Number = 1; i<=4; i++) {
this['videobutton'+i].id = i;
this['videobutton'+i].onRollOver = function() {
trace(this.id);
['stream'+this.id].pause(false);
this.attachVideo(['stream'+this.id]);
fadeIn(['video'+this.id]);
};
}
根据您滚动的按钮,它会跟踪1到5之间的数字。如果其他代码没有其他任何问题,它也应该与视频一起使用。