javascript - Chrome/jQuery Uncaught RangeError: el tamaño máximo de pila de llamadas excedido
jquery browser (6)
Recibo el error "RangeError no capturado: el tamaño máximo de pila de llamadas excedido" en Chrome. aquí está mi función jQuery
$(''td'').click(function () {
if ($(this).context.id != null && $(this).context.id != '''') {
foo($(''#docId'').val(), $(this).attr(''id''));
}
return false;
});
Tenga en cuenta que hay decenas de miles de celdas en la página. Sin embargo, generalmente asocio desbordamientos de pila con recursión y en este caso, hasta donde puedo ver, no hay ninguno.
¿La creación de una lambda como esta genera automáticamente una carga de cosas en la pila? ¿Hay alguna forma de evitarlo?
Por el momento, la única solución que tengo es generar los eventos onclick de forma explícita en cada celda cuando se renderiza el HTML, lo que hace que el HTML sea mucho más grande.
Como "hay decenas de miles de celdas en la página", el enlace del evento de clic a cada celda provocará un terrible problema de rendimiento. Hay una forma mejor de hacerlo, que es vincular un evento de clic al cuerpo y luego averiguar si el elemento de la celda fue el objetivo del clic. Me gusta esto:
$(''body'').click(function(e){
var Elem = e.target;
if (Elem.nodeName==''td''){
//.... your business goes here....
// remember to replace $(this) with $(Elem)
}
})
Este método no solo hará su tarea con la etiqueta "td" nativa sino también con la "td" adjunta posteriormente. Creo que estarás interesado en este artículo sobre el enlace de eventos y delegado
O simplemente puede usar el .on() " .on() " de jQuery con el mismo efecto:
$(''body'').on(''click'', ''td'', function(){
...
});
El mío fue más un error, lo que sucedió fue un clic de bucle (supongo) básicamente al hacer clic en el inicio de sesión también se hizo clic en el padre que terminó provocando que se excediera el tamaño máximo de la pila de llamadas.
$(''.clickhere'').click(function(){
$(''.login'').click();
});
<li class="clickhere">
<a href="#" class="login">login</a>
</li>
Este problema me sucedió cuando usé jQUery Fancybox dentro de un sitio web con muchos otros complementos jQuery. Cuando utilicé el LightBox ( sitio aquí ) en lugar de Fancybox, el problema desapareció.
Recientemente me encontré con este problema también. Tenía una mesa muy grande en el diálogo div. Fue> 15,000 filas. Cuando se invocó .empty () en el diálogo div, estaba obteniendo el error anterior.
Encontré una solución redonda en la que antes de llamar a limpiar el cuadro de diálogo, quitaba cada una de las filas de la gran tabla y luego llamo a .empty (). Aunque parecía haber funcionado. Parece que mi versión anterior de JQuery no puede manejar elementos tan grandes.
También puede obtener este error cuando tiene un ciclo infinito. Asegúrate de no tener ninguna autoreferencia recursiva e interminable.
U puede usar
$(document).on(''click'',''p.class'',function(e){
e.preventDefault();
//Code
});