【问题标题】:Flash AS3 button eventlistener array bugFlash AS3 按钮事件监听器数组错误
【发布时间】:2011-03-02 19:55:53
【问题描述】:

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

我在一个时间轴上有一个包含 12 个按钮的数组,当第一次访问时间轴的那个部分时,使用 for 循环将 CLICK 事件监听器添加到它们。在那一点上,它们都可以完美地工作。

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

我的所有按钮都正确命名,绝对没有输出错误(我使用了调试模块),并且我确保其中包含按钮的数组在单击关闭按钮时输出所有 12 个按钮添加事件监听器。

    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);
        }

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

【问题讨论】:

  • 最后三个,在调试的trace中看到了什么?
  • 您要导出的 Flash 版本是什么?如果您正在访问框架上的某些内容,您只需 gotoAndStop-ed.. 它可能无法访问.. 应该会产生运行时异常.. 如果您只将字符串存储在数组中.. 尝试跟踪对象.. 如果其中一些是不为空(再次......如果它们是......它应该给出运行时异常......但我没有想到其他任何东西)

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


【解决方案1】:

在我看来有些可疑的是,您在 hideBio() 开始时从 closeBio_btn 中删除了事件侦听器。尝试将该行放在 for 循环之后。

我很难证明这种预感是正确的,但我脑海中闪过几个疯狂的理论:

  1. 这是一个竞争条件。您正在从处理程序本身内部删除处理程序的侦听器,并且由于处理程序是动态添加的,运行时将处理程序标记为垃圾收集。在下一次扫描中,处理程序被删除——但由于 gotoAndPlay 可能需要不显着的时间,处理程序在被杀死时仍在 for 循环中添加点击处理程序,并且此时仅添加了前 9 个。
  2. 这是一个数据损坏问题。由于隐藏按钮和 12 个按钮的数组至少通过 BoD_mc 相切相关,因此运行时在幕后进行了一些奇怪的优化,这使得通过 Bod_mc[with index] 访问项目在触摸 closeBio_btn 后变得不可靠。

这是一个有趣的问题,希望你能找到解决办法:)

【讨论】:

    【解决方案2】:

    似乎解决了这个问题,我只需要动态添加每个 btn,而不是只将它们放在时间轴上。不过还是很奇怪,谢谢大家

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 2012-05-04
      相关资源
      最近更新 更多