Ich habe eine Webanwendung, die dynamisch Daten über einen langen Zeitraum lädt. Innerhalb der Daten befinden sich Links zu Bildern, die dann im Browser gerendert werden.Richtig entsorgen von Browserressourcen
z.B.
var object = {
Name: ko.observable("Foo"),
Ref: ko.observable("Bar"),
ImageUrl: ko.observable("http://.....")
}
Ich verwende Knockoutjs ‚s Vorlage, um die Daten auf dem Bildschirm machen verbindlich.
<img data-bind="attr: { src: imageUrl }" />
Also jedes Mal, wenn die Objektänderungen über einen Ajax-Aufruf, die Knockoutjs Vorlage mit den Daten neu gerendert wird, und die Bilder ändern.
Nach einer langen Zeit bauen sich diese Bilder auf und werden mehr Speicher verbrauchen. Moderne Browser scheinen besser zu bewältigen, aber das Problem ist hauptsächlich mit IE8 (wir unterstützen < IE8 nicht). Selbst in modernen Browsern wird der Speicher irgendwann so hoch, dass der Browser einfriert.
In diesem Screenshot sehen Sie ein Beispiel für den Aufbau der Bildressourcen.
entschied ich mich, um zu sehen, was passieren würde, wenn stattdessen einen <img />
Tag der Verwendung ein <iframe />
verwenden.
So jetzt mein Code sieht aus wie
<iframe data-bind="attr: { src: imageUrl }"></iframe>
Was jetzt passiert, ist, dass der Rahmen geschaffen wird, aber sobald die imageUrl ändert, wird der Rahmen einfach Updates und schafft keine zusätzlichen Mittel.
Also, wenn ich unten die Browser Speichernutzung halten will, kann ich diese <iframe />
Technik verwenden, aber ich mag es nicht. Es zwingt mich, viele andere Änderungen an der Anwendung vorzunehmen, und ich muss iframes verwenden!
Ich habe jetzt verschiedene Tests durchgeführt, um zu sehen, wie viel Speicher mit beiden Techniken verbraucht wird, und im gleichen Zeitraum steigt der Speicher von 81.000.000 auf 200.000.000 (mit <img />
) im Vergleich zu 81.000.000 auf 98.000.000 (mit <iframe />
)
Frage
gibt es eine bessere Art und Weise Bildressourcen in einem Browser zu verwalten? Gibt es eine Möglichkeit, dieses Bild richtig zu entsorgen? Ich habe das Internet nach einer Antwort gesucht, aber bis jetzt habe ich nichts gefunden.
bearbeiten
Auf der sehr einfachen Ebene. Ich habe versucht, ein Bild über die jQuery-Methode remove()
zu entfernen, aber die Bildressource wird nie entfernt. Sehen Sie diese Geige für ein sehr einfaches Beispiel.http://jsfiddle.net/ezb9e/
Code:
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);
});
Ist es möglich, diese Hooks zu verwenden: http://knockoutjs.com/documentation/template-binding.html#note_3_using_afterrender_afteradd_and_beforeremove, um das Bild manuell aus dem DOM zu entfernen, bevor das neue hinzugefügt wird? Das sollte das Problem stoppen. – Nik
Ich habe bereits versucht, das Bild zuerst zu entfernen und dann ein neues hinzuzufügen, aber die Bildressourcen werden immer aufgebaut. Sehen Sie diese Geige für ein Beispiel. http://jsfiddle.net/ezb9e/ –
Ändern sich die Bild-URLs immer, wenn Sie die Daten aktualisieren, oder bleiben sie relativ konstant? –