$.cache
Rozmiar przy wartości nominalnej nie mówi nic o wyciekach pamięci. Może być bardzo mały i nadal ma wyciek pamięci lub może być bardzo duży i nie ma wycieku pamięci.
Jeśli wiesz, że na stronie jest 10 detektorów zdarzeń związanych z jQuery, a mimo to $.cache
ma więcej wpisów, oznacza to, że wycieknie.
Ogromnym oszczędzaniem pamięci jest używanie delegowania zdarzeń zamiast dołączania detektorów zdarzeń do każdego elementu.
Powiedz:
<ul>
<li></li>
<li></li>
<li></li>
</ul>
$("li").on("click", fn)
byłoby dołączyć 3 indywidualne programy obsługi zdarzeń (więcej, jeśli masz więcej Li oczywiście), natomiast $("ul").on("click", "li", fn)
byłoby dołączyć tylko jeden, niezależnie od tego, ile li-elementy masz i jeszcze ten sam wynik.
Przykład wycieku:
$("button").click(function() {
$("#target")[0].innerHTML = "";
$("<div>").appendTo($("#target")).click($.noop);
$("#log").text(Object.keys($.cache).length);
});
http://jsfiddle.net/SGZW4/1/
Wynika to z faktu, że .innerHTML jest stosowany, który nie jest częścią jQuery więc nie należy oczyścić.
Fix jest użycie metody jQuery dla tego samego:
$("button").click(function() {
$("#target").html("");
$("<div>").appendTo($("#target")).click($.noop);
$("#log").text(Object.keys($.cache).length);
});
http://jsfiddle.net/SGZW4/2/
Nie chodzi o to, jak duże to jest, ale jak rośnie z upływem czasu. Jeśli pamięć podręczna nie jest ograniczona (tzn. Zwiększa się na zawsze) prawdopodobnie masz wyciek pamięci. –
jQuery jest naprawdę kompatybilny z przeglądarką. Wiąże się to z problemem IE związanego z prawidłowym usuwaniem elementów we wszystkich przeglądarkach. –
Byłbyś mocno naciągany, aby nadwerężyć nowoczesne możliwości pamięci, jeśli jesteś rozsądny. O ile oczywiście nie stworzysz wystarczająco dużego wycieku pamięci. Nie ma magicznej ilości pamięci, wszystko zależy od sprzętu użytkownika. Czy interesują Cię osoby korzystające z komputerów z lat 90.? –