Foros del Web » Programando para Internet » Javascript »

Doevents en Javascript

Estas en el tema de Doevents en Javascript en el foro de Javascript en Foros del Web. Hola a todo el mundo, No soy demasiado experto en Javascript y por eso pregunto, tengo un pequeño código que hace un bucle de 20000 ...
  #1 (permalink)  
Antiguo 05/09/2007, 13:33
Avatar de pempas  
Fecha de Ingreso: diciembre-2003
Ubicación: Barcelona
Mensajes: 985
Antigüedad: 20 años, 4 meses
Puntos: 6
Doevents en Javascript

Hola a todo el mundo,

No soy demasiado experto en Javascript y por eso pregunto, tengo un pequeño código que hace un bucle de 20000 registros, y claro, el explorer se colapsa cuando lo está haciendo...

¿Hay alguna forma de hacer que no se colapse?, como el DoEvents en Visual Basic...

Me salvarían la vida,

Muchas gracias!
  #2 (permalink)  
Antiguo 05/09/2007, 17:49
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: Doevents en Javascript

¿Es muy pesado el código? La verdad es que 20 000 iteraciones con una simple función que llames ya tarda demasiado...
Código PHP:
function cuadrado(x) {
    return 
x*x;
}

var 
inicio = new Date();
var 
str "";
for(var 
i=0i<20000i++) {
    
str += (i+" al cuadrado es "+cuadrado(i)+". <br/>");
}
document.write(str);
document.write("He tardado "+(new Date().getTime() - inicio.getTime() )+" ms."); 
Me ha dicho en IE6
Cita:
He tardado 60047 ms.
Y eso es evidentemente largo para cualquiera.

Lo que suelo hacer en esos casos es hacer un setTimeout() de la función que quiero iterar, le pongo un intervalo de 100ms. Al final tarda más en ejecutar la tarea, pero puedo ver qué ocurre sin que el navegador se me bloquee.

Claro que, no se puede hacer eso en todos los casos.

¿De qué se trata? Te dejo un link: optimizar javascript que quizás te pueda venir bien leer para optimizar cosas pesadas.


Un saludo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #3 (permalink)  
Antiguo 06/09/2007, 01:57
Avatar de pempas  
Fecha de Ingreso: diciembre-2003
Ubicación: Barcelona
Mensajes: 985
Antigüedad: 20 años, 4 meses
Puntos: 6
Re: Doevents en Javascript

Pues ciertamente el código son unas cuantas líneas, lo que hace es llamar mediante Ajax a una página que captura un código:

Código PHP:
<script language="javascript">
    function 
recorrecombo() {
        
frm=document.forms["formularios1"]
        
frm.BotonEmail.disabled=true;
        var 
element1 =  document.getElementById("aqui");
        
element1.innerHTML '<img src="/images/cargando.gif" />'
        var final = 
document.getElementById("url").length-1
        
for (i=0i<=document.getElementById("url").length-1i++) {
            var 
fragment_url '/modulos/parser.asp?Id='+document.getElementById("url").options[i].value+'&url='+document.getElementById("url").options[i].text;
            var 
ajax=nuevoAjax();
            
ajax.open("GET"fragment_urltrue); 
            
ajax.send();
            
ajax.onreadystatechange = function() { 
                if (
ajax.readyState == 4) { 
                    
//escribimos la respuesta 
                    
if (i==final){
                        
element1.innerHTML 'Procesados '+i+' de '+final+' ('+document.getElementById("url").options[i].value+')<br>¡Proceso Concluido!';
                        
frm=document.forms["formularios1"]
                        
frm.BotonEmail.disabled=false;
                    }
                    else{
                        
element1.innerHTML 'Procesados '+i+' de '+final+' ('+document.getElementById("url").options[i].value+')<br><img src="/images/cargando.gif" />'
                    }
                } 
            }
        } 
    }
    
</script> 
Los valores los coge de un combo oculto que tiene todos los datos.

No sé muy bien como aplicar la función settimeout()

Ciertamente lo que tarde no me preocupa ya que tardará y mucho... pero claro, quiero que vaya mostrando el progreso en la página.

Un saludo!
  #4 (permalink)  
Antiguo 06/09/2007, 03:11
Avatar de pempas  
Fecha de Ingreso: diciembre-2003
Ubicación: Barcelona
Mensajes: 985
Antigüedad: 20 años, 4 meses
Puntos: 6
Re: Doevents en Javascript

¡Ya encontré la solución para hacerlo!

Código PHP:
<script language="javascript">
    var 
t;
    var 
i=0;
    
    function 
inicio() {
        var 
element2 =  document.getElementById("aqui1"); 
        
element2.innerHTML '<img src="/images/cargando.gif" />';
        var 
element4 =  document.getElementById("aqui"); 
        
element4.innerHTML 'Alcanzando el punto anterior de recorrido...';
        
recorrecombo();
    }
    
    function 
recorrecombo() {
        
frm=document.forms["formularios1"]
        
frm.BotonEmail.disabled=true;
        
frm.BotonCancela.disabled=false;
        var 
element1 =  document.getElementById("aqui"); 
        var final = 
document.getElementById("url").length-1;
        var 
fragment_url '/modulos/parser.asp?Id='+document.getElementById("url").options[i].value+'&url='+document.getElementById("url").options[i].text;
        
element1.innerHTML 'Consultando estado para '+document.getElementById("url").options[i].value+'...';
        var 
ajax=nuevoAjax();
        
ajax.open("GET"fragment_urltrue); 
        
ajax.send();
        
ajax.onreadystatechange = function() { 
            if (
ajax.readyState == 4) { 
                
//escribimos la respuesta 
                
if (i==final){
                    
element1.innerHTML 'Procesados '+i+' de '+final+' ('+document.getElementById("url").options[i].value+')<br>¡Proceso Concluido!';
                    
frm=document.forms["formularios1"]
                    
frm.BotonEmail.disabled=false;
                    
clearTimeout(t);
                }
                else{
                    
element1.innerHTML 'Procesados '+i+' de '+final+' ('+document.getElementById("url").options[i].value+')'
                }
            } 
        }
        
i=i+1
        t
=setTimeout("recorrecombo()",4000)
    }
    
    function 
anulabucle() {
        
clearTimeout(t);
        var 
element3 =  document.getElementById("aqui1"); 
        
element3.innerHTML 'Pulse Comenzar para reanudar el Proceso...';
        
frm.BotonEmail.disabled=false;
        
frm.BotonCancela.disabled=true;
    }
    
</script> 
Muchas gracias por la ayuda

Salu2!
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 22:09.