Flash AS3按钮eventlistener数组错误

时间:2010-06-11 19:48:51

标签: actionscript-3 arrays button for-loop event-listener

这是我第一次在这里发帖提问。

我在时间轴上有一个包含12个按钮的数组,当第一次访问时间轴的那一部分时,使用for循环添加一个CLICK eventlistener。所有这些都在这一点上完美运作。

当您单击一个时,它会在特定的movieClip中播放一个帧标签,并使用关闭按钮在相应的人物上显示一个生物,然后再次使用for循环删除每个按钮的CLICK事件监视器。关闭按钮播放关闭动画,然后时间线返回到第一帧(其上有12个按钮的那个)并重新添加CLICK事件监视器,但现在只有阵列的前9个按钮工作。没有输出错误,重新添加eventlisteners的代码与第一次有效时完全相同。我完全不知所措,我想知道是否有其他人遇到过这个问题。

我的所有按钮都被正确命名,绝对没有输出错误(我已经使用过调试模块)而且我确保带有按钮的数组在点击关闭按钮时输出全部12个添加eventlisteners。

    for (var q = 0; q < ackBoDBtnArray.length; q++){
        contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[q]].addEventListener(MouseEvent.CLICK, showBio);
    }

    private function showBio(eo:MouseEvent):void {
        trace("show the bio");
        bodVar = ackBoDBtnArray.getIndex(eo.target.name);
        contentArea_mc.acknowledgements_mc.BoD_mc.gotoAndPlay(ackBoDPgArray[bodVar]);
        contentArea_mc.acknowledgements_mc.BoD_mc.closeBio_btn.addEventListener(MouseEvent.CLICK, hideBio);
        for (var r = 0; r < ackBoDBtnArray.length; r++){
            contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[r]].mouseEnabled = false;
            contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[r]].removeEventListener(MouseEvent.CLICK, showBio);
        }
    }
    private function hideBio(eo:MouseEvent):void {
        trace("hide it!");
        contentArea_mc.acknowledgements_mc.BoD_mc.closeBio_btn.removeEventListener(MouseEvent.CLICK, hideBio);
        contentArea_mc.acknowledgements_mc.BoD_mc.gotoAndPlay(ackBoDClosePgArray[bodVar]);
        for (var s = 0; s < ackBoDBtnArray.length; s++){
            trace(ackBoDBtnArray[s]);
            contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[s]].mouseEnabled = true;
            contentArea_mc.acknowledgements_mc.BoD_mc[ackBoDBtnArray[s]].addEventListener(MouseEvent.CLICK, showBio);
        }

提前感谢您提供的任何帮助和见解......我有一种轻微的感觉,这种感觉对于另一组眼睛来说可能是显而易见的......哈哈。

2 个答案:

答案 0 :(得分:0)

对我来说可疑的是你在hideBio()的开头从closeBio_btn中删除了事件监听器。尝试在for循环后放置该行。

我无法证明这种预感是正确的,但是我想到了几个疯狂的理论:

  1. 这是竞争条件。您正在从处理程序本身内部删除处理程序的侦听器,并且由于处理程序是动态添加的,因此运行时标记了垃圾收集的处理程序。在下一次扫描时,处理程序被删除 - 但由于gotoAndPlay可能需要非常长的时间,因此处理程序仍然在for循环中添加点击处理程序,并且此时仅添加了前9个。
  2. 这是一个数据损坏问题。由于隐藏按钮和12个按钮的数组至少通过BoD_mc切向相关,因此运行时在幕后做了一些奇怪的优化,这使得在触摸closeBio_btn之后通过Bod_mc [带索引]访问项目是不可靠的。
  3. 这是一个有趣的问题,我希望你找到一个解决方案:)

答案 1 :(得分:0)

似乎解决了这个问题我必须动态添加每个btn,而不是仅仅在时间轴上添加它们。但仍然很奇怪,谢谢大家