画像フレームを切り替えてモーションを作成する JavaScript ウィジェットがあります。ウィジェットは、renderメソッドが呼び出されたときにこれらのフレームをフェッチし、 disposeメソッドが呼び出されたときにそれらへの参照を破棄します。
この実装は、PreloadJS ( http://www.createjs.com/#!/PreloadJS/documentation ) を使用して一連のフレームをロードし、現在のフレームを<canvas>にレンダリングするか、display:none と display を切り替えます。 :レガシー ブラウザのイメージ要素でブロックします。
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
エラーがスローされます。
アイデア/提案は非常に役に立ちます。ただし、提案する前にコードを確認してください。画像へのすべての参照が無効になり、画像ローダーのインスタンスも破棄されました。循環参照を作成する画像要素にイベント リスナーはありません。画像を解放する必要があることがわかります。