長期間にわたってデータを動的にロードする Web アプリケーションがあります。データ内には、ブラウザでレンダリングされる画像へのリンクがあります。
例えば
var object = {
Name: ko.observable("Foo"),
Ref: ko.observable("Bar"),
ImageUrl: ko.observable("http://.....")
}
画面にデータをレンダリングするためにKnockoutjsのテンプレート バインディングを使用しています。
<img data-bind="attr: { src: imageUrl }" />
したがって、オブジェクトが Ajax 呼び出しによって変更されるたびに、Knockoutjs テンプレートがデータとともに再レンダリングされ、画像が変更されます。
長期間経過すると、これらのイメージが蓄積され、より多くのメモリが消費されます。最新のブラウザーはよりうまく対応しているようですが、問題は主に IE8 にあります (IE8 未満はサポートしていません)。最新のブラウザでも、最終的にはメモリが非常に高くなり、ブラウザがフリーズします。
イメージ リソースの構築例については、このスクリーン ショットを参照してください。
<img />
タグを使用する代わりに を使用するとどうなるかを確認することにしました<iframe />
。
だから私のコードは今のようになります
<iframe data-bind="attr: { src: imageUrl }"></iframe>
ここでフレームが作成されますが、imageUrl が変更されるとすぐに、フレームは単純に更新され、追加のリソースは作成されません。
したがって、ブラウザのメモリ使用量を抑えたい場合は、この<iframe />
手法を使用できますが、私は好きではありません。アプリケーションに他にも多くの変更を加える必要があり、さらに iframe を使用する必要があります。
さまざまなテストを実行して、両方の手法を使用してどれだけのメモリが消費されるかを確認しました。同じ期間に、メモリは 81,000k から 200,000k に増加し ( を使用<img />
)、81,000k から 98,000k に増加します ( を使用<iframe />
) 。
質問
ブラウザ内で画像リソースを管理するより良い方法はありますか? この画像を適切に処分する方法はありますか? 答えを求めてウェブを検索しましたが、これまでのところ何も見つかりませんでした。
編集
非常に基本的なレベルで。jQuery メソッドで画像を削除しようとしましたremove()
が、画像リソースが削除されません。非常に基本的な例については、このフィドルを参照してください。http://jsfiddle.net/ezb9e/
コード:
html
<img src="http://www.fillmurray.com/200/300" />
JS
$(function(){
setTimeout(function(){
$('img').remove();
$('body').append($('<img />', { attr: { src: 'http://www.fillmurray.com/300/200' }}));
}, 3000);
});