2011-10-05 13 views
94

Viene visualizzato l'errore "Uncaught RangeError: Maximum stack stack size exceeded" su chrome. ecco la mia funzione jQueryChrome/jQuery Uncaught RangeError: Superato lo stack stack delle chiamate superato

$('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 alternativa è generare gli eventi onclick esplicitamente su ogni cella durante il rendering dell'HTML, il che rende l'HTML molto più grande.

+2

Sei sicuro che la funzione foo non riceva? L'errore si verifica ancora se si rimuove la chiamata di funzione? – sth

+1

Funziona come previsto in altri browser? Questo errore si verifica quando si commenta 'foo ($ ('# docId'). Val(), $ (this) .attr ('id'));' line? - Suggerimento per prestazioni extra: memorizza il risultato dei selettori in cache - ad esempio mantieni il risultato di '$ (this)' in una variabile e poi usalo sull'handler come necessario. – WTK

+0

Ho un problema simile ma ho bisogno di eventi mouseenter. Quando uso il corpo o il tavolo non ho abbastanza eventi. – ericslaw

risposta

113

Come "ci sono decine di migliaia di celle nella pagina" che vincola l'evento clic a ogni singola cella causerà un terribile problema di prestazioni. Esiste un modo migliore per farlo, ovvero legare un evento click al corpo & per scoprire se l'elemento cella era il target 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 fare la tua attività con tag nativo "td", ma anche con più tardi aggiunto "td". Credo che sarete interessati a questo articolo su event binding & delegate


Oppure si può semplicemente utilizzare il metodo ".on()" di jQuery con lo stesso effetto:

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

grazie, siamo comunque in difficoltà per le prestazioni, quindi questa è una grande idea :-) – Andy

+57

Nooo, non usare .live() !!! http://bitovi.com/blog/2011/04/why-you-should-never-use-jquery-live.html Usa un .delegate() (o .on() se il tuo jQuery è abbastanza nuovo), e delegare dal livello del tavolo piuttosto che dall'intero documento. Ciò migliorerà molto le tue prestazioni rispetto all'utilizzo di .live(), che essenzialmente si limiterà a delegare l'intero documento verso il basso. – brandwaffle

+17

E .live è stato rimosso da jQuery 1.9 – cpuguy83

3

Questo problema è accaduto con me quando ho usato jquery Fancybox all'interno di un sito web con molti altri plugin jQuery. Quando ho usato il LightBox (site here) invece di Fancybox, il problema è scomparso.

28

È inoltre possibile ottenere questo errore quando si dispone di un ciclo infinito. Accertati di non avere riferimenti personali non ricorrenti e ricorsivi.

+3

Questo ha risolto il problema. Ho avuto un 'Drink' e un '$ ('# linkDrink'). Click();' in 'drinkBeer()'. –

4

Il mio era più di un errore, quello che è successo è stato il clic del ciclo (credo) fondamentalmente facendo clic sul login è stato anche fatto clic sul genitore che ha provocato il superamento della dimensione massima dello stack delle chiamate.

$('.clickhere').click(function(){ 
    $('.login').click(); 
}); 

<li class="clickhere"> 
    <a href="#" class="login">login</a> 
</li> 
1

U può utilizzare

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

recente ho appena incontrato 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 rotonda in cui prima chiamavo la pulizia della finestra di dialogo, rimuovevo ogni altra riga dalla tabella molto grande, quindi richiama il .empty(). Sembrava aver funzionato però. Sembra che la mia vecchia versione di JQuery non possa gestire elementi così grandi.

Problemi correlati