我有一个JavaScript小部件,可在图像帧之间切换以创建动作, 小部件在调用 render 方法时获取这些框架,并在调用 dispose 方法时放弃对它们的引用。
该实现通过使用PreloadJS(http://www.createjs.com/#!/PreloadJS/documentation)加载一组帧,然后将当前帧呈现为< canvas> ,或切换display:none并显示:阻止旧版浏览器上的图像元素。
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
如果删除此代码(以及随附的处理代码on :251-259),则图像处理正确,只有在将元素添加到DOM时才会出现问题。
如果在dispose失败后调用render方法,则抛出经典的Stack verflow at line: 0
错误。
任何想法/建议都会非常有帮助。请在建议之前查看代码,所有对图像的引用都已被置零,并且图像加载器的实例也已被处理,图像元素上没有事件监听器可以创建循环引用,等等。我可以看到图像应该被释放。