【发布时间】:2010-09-30 17:07:33
【问题描述】:
好的,这就是我想要做的:
我有一个登陆页面,上面有 3 个按钮,我有 3 个对应的外部 swf 文件,每个按钮一个……所以用户单击一个按钮,相应的 swf 文件被加载到舞台上的一个空 MC 中.现在,这些外部 swf 文件中的每一个还包含多个按钮,并且每个按钮在单击时都会触发一个单击事件,每个 swf 中的每个按钮事件都是基于按钮名称和 swf 文件名唯一命名的(例如:swf1_button1_click)所以在单击按钮后的主 swf 文件中,我循环遍历 3 个主按钮,并将侦听器添加到每个按钮的空持有人剪辑的内容中,以便侦听“swf1_button1_click”、“swf1_button2_click”、“swf2_button1_click”.. 。 等等等等。
现在这一切正常,剪辑正确加载,事件触发并正确听到,这意味着空剪辑确实收到“swf1_btn1_click”事件并且它正确触发与该事件关联的代码,但问题在于被调用的函数, 这里是有问题的代码...
加载外部swf文件的函数:
function loadCommunity(e:MouseEvent) {
var mLoader:Loader = new Loader();
var community:String = MovieClip(e.currentTarget).name;
trace("Loading " + community);
var mRequest:URLRequest = new URLRequest(DevSite+"/flash/" + community + ".swf?community=" + community);
mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, displayCommunity);
mLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, function(e:ProgressEvent) {
var percent:Number = e.bytesLoaded / e.bytesTotal;
percent = Math.round(percent * 100);
trace(percent + "% loaded");
});
mLoader.load(mRequest);
}
分配事件监听器的代码:
function displayCommunity(e:Event) {
for (var i = 0; i < mcCommunityHolder.numChildren; i++) {
mcCommunityHolder.removeChild(mcCommunityHolder.getChildAt(i));
}
mcCommunityHolder.alpha = 0;
mcCommunityHolder.visible = true;
mcCommunityHolder.addChild(e.currentTarget.content);
TweenLite.to(mcCommunityHolder, 1, {alpha:1, easing:Elastic.easeOut});
var newClip:MovieClip = MovieClip(mcCommunityHolder.getChildAt(mcCommunityHolder.numChildren - 1));
for each (var mc:MovieClip in mcCommunities) {
var commName:String = mc.name.toLowerCase();
trace(" ... " + commName + " ... ");
newClip.addEventListener(commName + "_btnMap", function(e:Event) { trace("clicked: " + commName); viewLotmap(commName); });
newClip.addEventListener(commName + "_btnLocation", function(e:Event) { trace("clicked: " + commName); viewLocationmap(commName); });
newClip.addEventListener(commName + "_btnAriel", function(e:Event) { trace("clicked: " + commName); arielPhotos(commName); });
newClip.addEventListener(commName + "_btnRegister", function(e:Event) { trace("clicked: " + commName); communityRegister(commName); });
}
}
所以我得到的是:无论外部 swf 的按钮是什么,我点击了其中按钮的事件,就好像我从外部 swf 3 中点击一个按钮......有意义吗?
这里有一个例子:我单击 Button1,外部 swf 1 加载并显示,在外部 swf 1 内我单击按钮 1,该按钮触发其事件“swf1_btn1_click”,主 swf 看到它,但是当这个函数(“communityRegister (commName);") 在侦听器事件中调用,“commName”始终是相同的值(主 swf 的 btn3 应该具有的值)。
因此,我的主要闪存片段将每个外部 swfs 事件视为来自外部 swf 3。我可以解释它的最佳方式是:将“commName:String”视为引用变量,当我在循环的每次迭代中将其辞职,它以前的使用也会更改为新值,所以每次我使用它时,它总是设置为最后一次分配的值...
Gahh !!,真是脑残,哈哈...我以前遇到过很多次这个问题,但从未真正弄清楚。我总是设法重新编写代码,直到它修复它自己,但我厌倦了这样做,我想知道为什么会发生这种情况。我对其他编写我想做的事情的方式不感兴趣,我需要知道导致这种行为的原因,所以不要羞于获得技术;)
提前致谢。
【问题讨论】:
标签: flash actionscript-3 variables foreach