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