2011-12-16 11 views
7

Tratando de hacer un texto ... animación de cargajQuery animación de texto carga

aquí es donde estoy: http://jsfiddle.net/aGfct/

puedo conseguir el ... que se añade a intervalos de 500 ms, pero entonces yo quiero para eliminarlos y luego iniciar la animación/hasta que se complete la carga (básicamente, puede repetir el ciclo para siempre, y desapareceré una vez hecho).

Cualquier ayuda sería genial.

Gracias.

_charlie

+0

¿por qué no utilizar un 'gif' – Rafay

+0

No es necesario un gif. Solo quiero tener el ciclo de "animación" de puntos hasta que esté cargado. – stursby

Respuesta

23
i = 0; 
setInterval(function() { 
    i = ++i % 4; 
    $("#loading").html("loading"+Array(i+1).join(".")); 
}, 500); 

Si desea cambiar la cadena después de 5 dice, eso es después de 10 iteraciones. Esto se puede lograr así.

i = 0; 
text = "loading"; 
setInterval(function() { 
    $("#loading").html(text+Array((++i % 4)+1).join(".")); 
    if (i===10) text = "start"; 
}, 500); 
1

Apenas añada esta línea al final de su bucle:

i = (i === 3) ? 0 : i; 

Eso es sólo un atajo para decir 'si i es igual a 3, configurarlo de nuevo a cero, de lo contrario dejarlo como es'. Eso debería iniciar de nuevo tu ciclo hasta que establezcas una condición de salida.

EDITAR: Un momento, yo en realidad no ver cómo se les añade la . (lo siento, no puede conseguir jsFiddle para ejecutar nada por el momento)! Si tuviera que usar el reinicio i como se indica anteriormente, realmente necesitaría establecer el número de caracteres . igual a i con cada iteración.

EDIT 2: Mirando de nuevo, tendría siquiera necesita tomar i en un cierre para obtener su valor en el momento de la setTimeout se declararon , de lo contrario obtendrá cualquier valor que es cuando setTimeout es ejecutado, que es impredecible. Básicamente, no use esta solución, ¡use Jeff's! ;)

+0

Eso causará un bucle infinito ... – Andrew

+0

@Andrew sí lo hará, lo que el PO mencionado no es un problema. Debido a la llamada 'setTimeout', cada ejecución del bucle será empujada al final de la pila, por lo que no debería bloquear la UI, pero vale la pena verla. –

+0

@ChrisFrancis Se bloqueará la interfaz de usuario. Estás haciendo una fila infinita de 'setTimeout's. El motor JS no espera a que se ejecute cada tiempo de espera antes de agregar uno nuevo. Use 'setInterval' si desea que el motor espere. – kba

2

Trate de usar setInterval también tan parecida:

setInterval(function(){ 
    for (i = 1; i <= 3; i++) { 
     setTimeout(function() { 
     $("#loading").append("."); 
     }, i * 500); 
    } 
    $("#loading").html('loading'); 
}, 2000); 
+0

también se puede asignar todo a una variable y clearInterval (myvar); Cuando termines –

+0

Creo que este enfoque es muy complejo, mira mi código más simple: http://stackoverflow.com/a/8537581/310276 – Diego

7

http://jsfiddle.net/paska/aGfct/12/

var originalText = $("#loading").text(), 
    i = 0; 
setInterval(function() { 

    $("#loading").append("."); 
    i++; 

    if(i == 4) 
    { 
     $("#loading").html(originalText); 
     i = 0; 
    } 

}, 500); 
3

Tengo una solución muy similar a roXon, solo en mi caso 2 funciones que he agregado.

  1. simplemente añada una elemnt en blanco con id = loadingDots, como span id = "loadingDots">
  2. Añadir la llamada de función en document.ready. Ahora en mi caso necesitaba mostrar los puntos de carga en algunas páginas, pero no en todas. Entonces, la función buscará el elemento con id = cargaDots, y si no se encuentra, borrará el intervalo.

Demo in JsFiddle

[HTML]

<!--Just have an element with id=loadingDots--> 
<span style="font-size:42px">Sending<span id="loadingDots"></span></span> 

[JS]

$(document).ready(function(){ 
    /**Call the function in document.ready somewhere*/ 
    showLoadingDots(); 
}); 

La función

var showLoadingDots = function() { 
    /**If element not found, do nothing*/ 
    if (!$("#loadingDots").length>0) return false; 

    var showDots = setInterval(function(){    
     //Thanks to roXon, StackOverflow 
     var d = $("#loadingDots"); 
     d.text().length >= 3 ? d.text('') : d.append('.'); 
    },300); 
} 

Hop e ayuda a alguien Gracias roXon, por ideas.