2012-04-12 14 views
5

Tengo un programa JavaScript, como por ejemplo:¿Por qué no es la longitud de un segundo correcto?

function addtime() { 
    curtime = document.getElementById("time").value * 1000; 
    curtime += 1; 
    document.getElementById("time").value = curtime/1000; 
} 
setInterval(function() { 
    addtime(); 
}, 1); 

que puede ver en mi código que estoy multiplicando por 1000 y luego dividiendo por 1000, y esto es porque quiero aumentará en una milésima de segundo cada vez, pero muestra la cantidad de segundos en la div de salida "time". Pero cuando abrí la página que tenía este código, un segundo no es realmente "un segundo", si entiendes lo que quiero decir. Actualmente es tres veces más largo que el segundo normal, y no sé por qué.

¿Cuál es el problema en mi código y qué puedo hacer para solucionarlo?

Gracias

Lucas

+1

Se puede publicar valor de "tiempo"? –

+1

creo que es porque llamas a addTime(); cada milisegundo eso significa mil llamadas por segundo, que su navegador seguramente no puede manejar, por lo tanto, verá que el número crece más lento de lo que debería. – Salepate

+0

Entonces, ¿qué debo hacer para solucionar el problema, y ​​qué quiere decir con "publicar" el "valor" de tiempo? – think123

Respuesta

4

El problema es que JavaScript no está garantizado para llamar a setInterval exactamente a la hora que se especifica, pero en la primera oportunidad que tiene después de que ha pasado el tiempo. Además, 1ms es waaaay bajo la resolución de muchos (¿todos?) Navegadores.

Para hacer esto correctamente, obtenga la hora de inicio, luego descubra los milisegundos transcurridos restando la hora actual.

var start = new Date(); 
var update = function() { 
    var now = new Date(); 
    var elapsed = now - start; 
    // now you can do something with `elapsed`, 
    // like stuff it into the UI 
}; 
setInterval(update, 100); 
+0

+1 current-start es de hecho el camino a seguir.De esta forma, incluso si el navegador "se cuelga" durante un par de segundos, se autocorregirá posteriormente. – Konerak

0

desde setInterval toma argumento como milisegundo, creo que se debe reemplazar 1 con 1000

function addtime() { 
    curtime = document.getElementById("time").value * 1000; 
    curtime += 1; 
    document.getElementById("time").value = curtime/1000; 
} 
setInterval(function() { 
    addtime(); 
}, 1000); 
+0

Se sabe que el tiempo de permanencia de 'setInterval' es impreciso y debe desaconsejarse. – Amadan

+0

@Amadan: por favor dame detalles de esto. no puedo entender – sarwar026

+0

Ver enlaces en la respuesta de Joseph. – Amadan

3

Aquí es a video donde J. Resig explica cómo Javascript temporizadores Incorrecto, en el contexto de su presentación sobre el uso de temporizadores en la prueba

"Los temporizadores OSX son precisos, hasta el milisegundo, pero en Windows, el temporizador solo se actualiza cada 15 ms".

aquí está another article por N. Zakas, que señala que la resolución del temporizador es diferente en algunos casos y también depende del navegador. La resolución de 1 ms es rápida, pero tomará un gran mordisco en el procesamiento de la CPU, por eso los navegadores la retiran. Hasta donde yo sé, los navegadores aceleran los temporizadores (así como la representación), cuando la pestaña no está enfocada.

Veo esto en cromo mucho, sobre todo en los ordenadores lentos, donde abertura 4 pestañas a la vez de la misma página, sólo el uno en foco observancia haga primero (icono de las agujas del reloj rápido), mientras que los otros continúan cargar (en sentido contrario en el sentido de las agujas del reloj icono de carga).

+0

+1, buenos enlaces. – Amadan

+0

de acuerdo, pero uso un mac. – think123

+0

bueno, eso puede deberse al navegador, así como a otros factores. no he encontrado documentos que expliquen mucho, solo los que proporcioné. – Joseph

1

Si desea un segundo de intervalo establecer un intervalo de un segundo en lugar de aumentar el tiempo en milisegundos aumentarlo por segundos. Luego puedes simplificar tu código de actualización de valores también.

ve aquí http://jsfiddle.net/NGTXU/

setInterval(function() { 
    document.getElementById("time").value++; 
},1000); 
Cuestiones relacionadas