Foros del Web » Programando para Internet » Javascript »

Uncaught RangeError: Maximum call stack size exceeded

Estas en el tema de Uncaught RangeError: Maximum call stack size exceeded en el foro de Javascript en Foros del Web. Buenas chicos, acudo aquí siempre que me encuentro en un callejón sin salida y bien, éste es un caso mas que no consigo explicarme. He ...
  #1 (permalink)  
Antiguo 17/11/2011, 13:18
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 15 años, 2 meses
Puntos: 13
Información Uncaught RangeError: Maximum call stack size exceeded

Buenas chicos, acudo aquí siempre que me encuentro en un callejón sin salida y bien, éste es un caso mas que no consigo explicarme.

He montado un script para hacer un "slideshow" en una pagina en blanco el cual funciona a la perfeccioon. Al meterlo en su sitio en la web, la funcion que mueve las imagenes y anima la barra de carga me salta ese error del titulo.

Uncaught RangeError: Maximum call stack size exceeded

Código Javascript:
Ver original
  1. function progresa($contenedor,$ancho_actual,$tiempo_estipulado) {
  2.         $tiempo = parseInt(defecto($tiempo_estipulado, $tiempo_entre_fases, false));
  3.         $reseteamos = defecto($ancho_actual, 'true', true);
  4.         if($reseteamos=="true") {
  5.             $('div.barras').stop(true,true);
  6.             $('div.barras').css({width:"0px"});
  7.         }
  8.         $($contenedor).animate(
  9.             {width:$ancho},
  10.             $tiempo,
  11.             function() {
  12.                 if($contador==$totalID) $contador = "0";
  13.                 $contador++;
  14.                 $(".syncmedia div.mediacontainer").scrollTo('#to'+$contador ,800);
  15.                 progresa('div#opcion'+$contador+' div.barras'); // Aqui es donde creo que está el problema
  16.             }
  17.         );
  18.         //alert(parseInt($tiempo));
  19.     }

El caso es que, en la propia web el mismo script que fabriqué en una pagina en blanco a parte no funciona y en dicha página, sí.

He estado buscando posibles razones de esto por internet y he dado con lo que creo que sería el origen, excesivas llamadas recursivas, pero no entiendo el motivo ya que solo llamo a la funcion una vez el .animate(); ha concluido.
  #2 (permalink)  
Antiguo 17/11/2011, 13:28
Avatar de linuxzero  
Fecha de Ingreso: noviembre-2011
Ubicación: Argentina
Mensajes: 778
Antigüedad: 13 años
Puntos: 160
Respuesta: Uncaught RangeError: Maximum call stack size exceeded

Postea el código completo, el html tambien así se puede llegar a probar y encontrar una solución ;)
__________________
Si todo fuera tan sencillo como un symfony cc la vida seria más fácil.
http://phpnico.wordpress.com
  #3 (permalink)  
Antiguo 17/11/2011, 14:19
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 15 años, 2 meses
Puntos: 13
Respuesta: Uncaught RangeError: Maximum call stack size exceeded

Muy bien...

Código Javascript:
Ver original
  1. $(document).ready(function() {
  2.     $contador = "1";
  3.     $tiempo_entre_fases = 7000; // Tiempo de la animacion de la barra
  4.     $ancho_total = $('#slider_novedad').css('width'); // Esto son parametros para la animacion
  5.     $ancho_por_miniatura = parseInt(parseInt($ancho_total) / parseInt($totalID))-6;
  6.     $('div#miniaturas div.opciones').css({"width" : $ancho_por_miniatura+"px"});
  7.     $ancho = $('div.opciones').css('width');
  8.     $tiepo_por_pixel = $tiempo_entre_fases / parseInt($ancho);
  9.  
  10.     function progresa($contenedor,$ancho_actual,$tiempo_estipulado) {
  11.         $tiempo = parseInt(defecto($tiempo_estipulado, $tiempo_entre_fases, false));
  12.         $reseteamos = defecto($ancho_actual, 'true', true);
  13.         if($reseteamos=="true") {
  14.             $('div.barras').stop(true,true);
  15.             $('div.barras').css({width:"0px"});
  16.         }
  17.         $($contenedor).animate(
  18.             {width:$ancho},
  19.             $tiempo,
  20.             function() {
  21.                 if($contador==$totalID) $contador = "0";
  22.                 $contador++;
  23.                 $(".syncmedia div.mediacontainer").scrollTo('#to'+$contador ,800);
  24.                 progresa('div#opcion'+$contador+' div.barras');
  25.             }
  26.         );
  27.     }
  28.  
  29.     progresa('div#opcion'+$contador+' div.barras');
  30.  
  31. // Esto hace que al pasar el mouse por encima de la imagen, la animacion se pause
  32.     $('.syncmedia').mouseover(function() {
  33.         $('div.barras').stop();
  34.     });
  35.  
  36. // Retoma la animacion cuando sacamos el mouse de la imagen
  37.     $('.syncmedia').mouseout(function() {
  38.         $tiepo_a_esperar = $tiempo_entre_fases-(parseInt($('div#opcion'+$contador+' div.barras').css('width'))*$tiepo_por_pixel);
  39.         progresa('div#opcion'+$contador+' div.barras', $('div#opcion'+$contador+' div.barras').css('width'),$tiepo_a_esperar );
  40.     });
  41.  
  42. // Para poder usar el menú de movimiento entre imagenes
  43.     $('div.opciones').click(function() {
  44.         $('div.barras').stop();
  45.         $div_actual = '#'+$(this).attr('id');
  46.         $contador = $div_actual.substr($div_actual.length - 1,$div_actual.length);
  47.         $(".syncmedia div.mediacontainer").scrollTo('#to'+$contador ,800);
  48.         progresa($div_actual + 'div.barras');
  49.     });
  50.  
  51.        
  52.     // Funcion para hacer parametros por defecto
  53.     //valor (contiene el valor actual del parámetro), defecto (contiene el valor por defecto)
  54.     //quiero_null (especifica si deseamos controlar algo especial, en este caso el valor 'undefined' ,
  55.     //                posibles valores true o false, por defecto adquiere false)
  56.     function defecto($valor, $defecto, $quiero_null){
  57.         $quiero_null = $quiero_null || false;
  58.         if ($quiero_null){
  59.             $valor = (typeof $valor == 'undefined') ? $defecto : $valor;
  60.         }else{
  61.             $valor = $valor || $defecto;
  62.         }
  63.         return $valor;
  64.     }
  65. });

Código HTML:
<div id="slider_novedad">
    <div class="syncmedia">
		<div class="mediacontainer">
			<a href="link">
                            <div id="to1" style="background-image: url(imagen)">
                                <div id="detalles">
                                   <div id="titulo">Titulo</div>
                                   <div id="texto">Texto</div>
                                </div>
                           </div>
                        </a>	
	         </div>
		<div class="mediacontainer">
			<a href="link">
                            <div id="to2" style="background-image: url(imagen)">
                                <div id="detalles">
                                   <div id="titulo">Titulo</div>
                                   <div id="texto">Texto</div>
                                </div>
                           </div>
                        </a>	
	         </div>
	</div>	
    <div id="miniaturas">
	<div class="opciones" id="opcion1" class="active" >
		<div id="txt">Titulo</div>
		<div id="progressbar">
			<div class="barras"></div>
		</div>
	</div>
	</div>
</div> 

Explico un poco lo que hace.

Dispone de un div para mostrar las imagenes que hace un scrollTo() cada 7000 milisegundos, en esos 7000 milisegundos añado una animacion a una barrita para darle mas apariencia, añadiendo un callback a la funcion jquery de animate();
  #4 (permalink)  
Antiguo 17/11/2011, 14:24
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 14 años, 5 meses
Puntos: 310
Respuesta: Uncaught RangeError: Maximum call stack size exceeded

No sé en qué navegador te da el error, pero si usas la consola de Chrome debería salirte la línea en que se produce. No he leído el código pero ese tipo de errores se produce en bucles infinitos, por ejemplo un while en el que no se aumenta la variable iteradora, o una función mal definida:
Código Javascript:
Ver original
  1. var fn = function(){}
  2. fn = function(){ fn(); bar(); }
Que al fin y al cabo sigue siendo un bucle infinito, pero menos explícito.
Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #5 (permalink)  
Antiguo 17/11/2011, 14:33
Avatar de linuxzero  
Fecha de Ingreso: noviembre-2011
Ubicación: Argentina
Mensajes: 778
Antigüedad: 13 años
Puntos: 160
Respuesta: Uncaught RangeError: Maximum call stack size exceeded

salvando por $totalID, que aparece en tu linea 5 y no lo definiste antes, por lo que me tira error, despues si lo creo y le asigno un valor 10 no me tira ningun error de js a mi en el chrome.
__________________
Si todo fuera tan sencillo como un symfony cc la vida seria más fácil.
http://phpnico.wordpress.com
  #6 (permalink)  
Antiguo 17/11/2011, 14:36
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 15 años, 2 meses
Puntos: 13
Respuesta: Uncaught RangeError: Maximum call stack size exceeded

el $totalID lo tengo asignado antes de otra funcion para hacer otra cosa, pero no es mas que un simple

Código Javascript:
Ver original
  1. $totalID = $("#slider_novedad div#miniaturas div.opciones").length;

La cosa es esa, que copiando este codigo en un documento nuevo y limpio no falla, pero incrustandolo en el codigo de mi web si, y no hay (Lo sé a ciencia cierta ya que el CMS es mio) nada que pueda estar en conflicto con este script en particular.
  #7 (permalink)  
Antiguo 17/11/2011, 14:40
Avatar de linuxzero  
Fecha de Ingreso: noviembre-2011
Ubicación: Argentina
Mensajes: 778
Antigüedad: 13 años
Puntos: 160
Respuesta: Uncaught RangeError: Maximum call stack size exceeded

Incluis mas de una libreria en js?? aparte del jquery??
__________________
Si todo fuera tan sencillo como un symfony cc la vida seria más fácil.
http://phpnico.wordpress.com
  #8 (permalink)  
Antiguo 17/11/2011, 14:44
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 15 años, 2 meses
Puntos: 13
Respuesta: Uncaught RangeError: Maximum call stack size exceeded

Sí, incluyo un par más, canvas y alguna otra, iré haciendo pruebas incluyendolas en el documento limpio aver si es alguna de ellas las que tiene conflicto, os expongo aqui los resultados.
  #9 (permalink)  
Antiguo 17/11/2011, 14:45
Avatar de linuxzero  
Fecha de Ingreso: noviembre-2011
Ubicación: Argentina
Mensajes: 778
Antigüedad: 13 años
Puntos: 160
Respuesta: Uncaught RangeError: Maximum call stack size exceeded

Espero que sea eso, es lo unico que se me ocurre.. hace eso y contanos ;)
__________________
Si todo fuera tan sencillo como un symfony cc la vida seria más fácil.
http://phpnico.wordpress.com
  #10 (permalink)  
Antiguo 17/11/2011, 18:00
Avatar de bNd170  
Fecha de Ingreso: agosto-2009
Ubicación: $this->setLocation('Valencia', 'Spain');
Mensajes: 365
Antigüedad: 15 años, 2 meses
Puntos: 13
Respuesta: Uncaught RangeError: Maximum call stack size exceeded

Tras probar distintas combinaciones de scripts he llegado a la conclusion de que el conflicto lo creaba un añadido de una version antigua del jquery que auto insertaba uno de los plugins que uso, al cargarlo despues que la version actual, no funcionaba la recrusiva como tocaba.

Fallo fixado =) gracias por las respuestas y ayuda.
  #11 (permalink)  
Antiguo 17/11/2011, 18:05
Avatar de linuxzero  
Fecha de Ingreso: noviembre-2011
Ubicación: Argentina
Mensajes: 778
Antigüedad: 13 años
Puntos: 160
Respuesta: Uncaught RangeError: Maximum call stack size exceeded

buenisimo!!! me alegro que lo hayas podido solucionar. mucha suerte con eso ;)

saludos
__________________
Si todo fuera tan sencillo como un symfony cc la vida seria más fácil.
http://phpnico.wordpress.com

Etiquetas: call, exceeded, funcion, size
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:57.