W przeglądarce Chrome pojawia się błąd „Uncaught RangeError: maksymalny rozmiar stosu wywołań przekroczony”. oto moja funkcja jQuery
$('td').click(function () {
if ($(this).context.id != null && $(this).context.id != '') {
foo($('#docId').val(), $(this).attr('id'));
}
return false;
});
Zwróć uwagę, że strona zawiera dziesiątki tysięcy komórek. Generalnie jednak przepełnienie stosu kojarzy mi się z rekurencją iw tym przypadku, o ile widzę, nie ma jej.
Czy tworzenie takiej lambdy automatycznie generuje ładunek rzeczy na stosie? czy jest jakiś sposób na obejście tego?
W tej chwili jedynym rozwiązaniem, jakie mam, jest jawne generowanie zdarzeń onclick w każdej komórce podczas renderowania kodu HTML, co sprawia, że kod HTML jest znacznie większy.
foo($('#docId').val(), $(this).attr('id'));
linii? - Dodatkowa wskazówka dotycząca wydajności: buforuj wyniki selektorów - na przykład zachowaj wynik$(this)
w zmiennej i używaj go w razie potrzeby w module obsługi.Odpowiedzi:
Ponieważ „strona zawiera dziesiątki tysięcy komórek”, powiązanie zdarzenia kliknięcia z każdą pojedynczą komórką spowoduje straszny problem z wydajnością. Jest na to lepszy sposób, polegający na przypisaniu zdarzenia kliknięcia do treści, a następnie sprawdzeniu, czy element komórki był celem kliknięcia. Lubię to:
Ta metoda nie tylko wykona Twoje zadanie z natywnym tagiem „td”, ale także z dołączonym później „td”. Myślę, że zainteresuje Cię ten artykuł o wiązaniu wydarzeń i delegowaniu
Lub możesz po prostu użyć metody „ .on () ” jQuery z tym samym efektem:
źródło
Możesz również otrzymać ten błąd, gdy masz nieskończoną pętlę. Upewnij się, że nie masz żadnych niekończących się, rekurencyjnych odwołań do siebie.
źródło
<a id="linkDrink" onclick="drinkBeer();">Drink</a>
i$('#linkDrink').click();
indrinkBeer()
.Mój był raczej błędem, co się wydarzyło, to kliknięcie w pętli (tak sądzę), w zasadzie po kliknięciu loginu, na który kliknięto również rodzica, co zakończyło się przekroczeniem maksymalnego rozmiaru stosu wywołań.
źródło
Ten problem wystąpił ze mną, gdy użyłem jQUery Fancybox w witrynie z wieloma innymi wtyczkami jQuery. Kiedy użyłem LightBox ( strona tutaj ) zamiast Fancybox, problem zniknął.
źródło
Możesz użyć
źródło
Niedawno właśnie napotkałem ten problem. Miałem bardzo dużą tabelę w oknie dialogowym div. Było> 15 000 rzędów. Po wywołaniu .empty () w oknie dialogowym div, otrzymałem powyższy błąd.
Znalazłem ogólne rozwiązanie, w którym przed wywołaniem czyszczenia okna dialogowego usunąłem co drugi wiersz z bardzo dużej tabeli, a następnie wywołałem .empty (). Wydawało się jednak, że zadziałało. Wygląda na to, że moja stara wersja JQuery nie radzi sobie z tak dużymi elementami.
źródło