Chrome / jQuery Uncaught RangeError: superata la dimensione massima dello stack di chiamate

Ricevo l’errore “Uncaught RangeError: Maximum stack stack size exceeded” su chrome. ecco la mia funzione jQuery

$('td').click(function () { if ($(this).context.id != null && $(this).context.id != '') { foo($('#docId').val(), $(this).attr('id')); } return false; }); 

Nota che ci sono decine di migliaia di celle nella pagina. Tuttavia, in genere associo lo stack overflow con la ricorsione e in questo caso, per quanto posso vedere, non c’è nessuno.

La creazione di un lambda come questo genera automaticamente un carico di cose in pila? c’è un modo per aggirarlo?

Al momento l’unica soluzione che ho è di generare esplicitamente gli eventi onclick su ciascuna cella durante il rendering dell’HTML, il che rende l’HTML molto più grande.

Poiché “ci sono decine di migliaia di celle nella pagina” che vincolano l’evento click a ogni singola cella causerà un terribile problema di prestazioni. C’è un modo migliore per farlo, cioè bind un evento click al corpo e poi scoprire se l’elemento cella era il bersaglio del clic. Come questo:

 $('body').click(function(e){ var Elem = e.target; if (Elem.nodeName=='td'){ //.... your business goes here.... // remember to replace $(this) with $(Elem) } }) 

Questo metodo non solo eseguirà il tuo compito con il tag “td” nativo ma anche con il successivo “td”. Penso che ti interesserà questo articolo sulla rilegatura degli eventi e sui delegati


Oppure puoi semplicemente usare il metodo ” .on () ” di jQuery con lo stesso effetto:

 $('body').on('click', 'td', function(){ ... }); 

Puoi anche ottenere questo errore quando hai un ciclo infinito. Accertati di non avere riferimenti personali non ricorrenti e ricorsivi.

Il mio è stato più un errore, quello che è successo è stato il click del loop (credo) in pratica facendo clic sul login che è stato fatto clic anche sul genitore che ha causato il superamento della dimensione massima dello stack delle chiamate.

 $('.clickhere').click(function(){ $('.login').click(); }); 
  • Questo problema è successo con me quando ho usato jQuery Fancybox all’interno di un sito Web con molti altri plugin jQuery. Quando ho usato il LightBox ( sito qui ) al posto di Fancybox, il problema non c’è più.

    U può usare

      $(document).on('click','p.class',function(e){ e.preventDefault(); //Code }); 

    Recentemente mi sono imbattuto in questo problema pure. Ho avuto una tabella molto grande nella finestra di dialogo div. Era> 15.000 righe. Quando è stato chiamato .empty () sulla finestra di dialogo, ho ricevuto l’errore sopra.

    Ho trovato una soluzione completa in cui, prima di chiamare la pulizia della finestra di dialogo, rimuovere ogni altra riga dalla tabella molto grande, quindi chiamare .empty (). Sembrava aver funzionato però. Sembra che la mia vecchia versione di JQuery non possa gestire elementi così grandi.