1

我有一个 JavaScript 小部件,它在图像帧之间切换以创建运动,小部件在调用其渲染方法时获取这些帧,并在调用dispose方法时丢弃对它们的引用。

该实现通过使用 PreloadJS ( http://www.createjs.com/#!/PreloadJS/documentation ) 加载一组帧,然后将当前帧渲染到<canvas>,或切换 display:none 和 display :block 在旧版浏览器上的图像元素上。

IE8 引起了问题,因为它不想在调用 dispose 方法时从这些帧中释放内存。(注意:仅当图像在 DOM 中时才会发生这种情况,否则一切正常。)

完整的源代码可以在这里找到:http: //pastie.org/8061442

图像在第 201 行添加到 DOM:

    var i = 0, img, node = self.$node[0];

    for ( ; i < self.imageSet.length; i += 1 ) {

        img = self.queue._loadedResults[self.imageSet[i]]

        img.setAttribute("draggable", "false")

        img.style.display = "none"

        node.appendChild(img)

        img = null
    }

    i = node = null

如果删除此代码(以及此处随附的处理代码:251-259),则图像被正确处理,只有当元素添加到 DOM 时才会出现问题。

如果在 dispose 失败后调用 render 方法,则会Stack verflow at line: 0抛出经典错误。

任何想法/建议都会非常有帮助。请在建议之前查看代码,对图像的所有引用都已被清空,并且图像加载器的实例也已被释放,图像元素上没有会创建循环引用的事件侦听器等。至于我可以看到图像应该被释放。

4

0 回答 0