2010-09-24 19 views
8

Busqué aquí y encontré una solución rápida para llamar a una acción cuando el usuario está inactivo en la página. Básicamente funciona bien en todos los navegadores.Problema extraño con setTimeout() en Google Chrome

Pero cuando utilizo una alerta o un cuadro de diálogo de confirmación en la página, el problema extraño ocurre en Google Chrome.

Después de que desaparezca el cuadro de alerta o confirmación (Presionado OK, Cancelar o Cruzar), la función inactiva funciona inesperadamente.

  • Después de confirmar la caja o cuadro de alerta desaparece, que entró desde el enlace de onclick, Tengo '3 segundos pasó' caja inmediatamente

probado en FF, IE y Chrome (más reciente). Simplemente ocurre en Chrome.

Mi código está aquí: http://jsbin.com/ifule3

window.onload = idleTimer; 
    function idleTimer() { 
    var idleDuration; 
    document.onmousemove = idleReset; 
    function idleReset() { 
     if (idleDuration) { 
     clearTimeout(idleDuration); 
     idleDuration = 0; 
     } 
     idleDuration = setTimeout(function() { 
     alert('3 seconds passed.'); 
     }, 3000) 
    } 
    }; 

<a onclick="if(confirm('?')) { alert('Ok Pressed.') } else { return false; };">First Link!</a> 
<a onclick="alert('test');" >Second Link!</a> 

Parece que mi explicación no es suficiente:/

he cambiado el código con jQuery;

jQuery(document).ready(function() { 
    var idleDuration; 
    jQuery(document).mousemove(function() { 
     if (idleDuration) { 
      clearTimeout(idleDuration); 
      idleDuration = 0; 
     } 

     idleDuration = setTimeout(function() { 
      someIdleAction(); 
      window.location = 'some url'; 
     }, 3000) 
    }) 
}); 

Cuando pongo este código en mi página, funciona como un encanto. Abro la página, hago algunas acciones con el mouse o no, luego 3 segundos sin mover el mouse, tengo la alerta inactiva. Esto es lo que necesito.

Cuando coloco un enlace que simplemente llama a un cuadro de alerta y hago clic en él, aparece el cuadro de alerta. Luego cierro el cuadro y recibí la alerta inactiva, que es '3 segundos pasados'.

<a onclick="if(confirm('Are you OK?')) { alert('Nice.') } else { return false; };">First Link!</a> 
    <a onclick="alert('An alert.');" >Second Link!</a> 

Se produce en google chrome. Con IE y FF todo está bien. Aumentando el tiempo de espera, nada cambia.

+3

* "... la función inactiva funciona inesperadamente." * Inesperadamente ** cómo **?!?! –

+3

Bienvenido a StackOverflow. A diferencia de otros sitios, uno de los objetivos es que StackOverflow * esté solo *. Por supuesto, conéctese a ejemplos prácticos en vivo como lo hizo, pero incluya el código que está usando en su pregunta (es por eso que Yi Jiang lo copió allí para usted). Link Rot puede establecerse fácilmente (los recursos externos se eliminan, renombrar, etc.) y además, las personas no deberían tener que ir a otro lado si pueden ver lo que está mal de la pregunta en sí. ¡Que te diviertas! –

+0

@ T.J. Crowder, +1 para el, básicamente, ** HULK SMASH !! ** = D –

Respuesta

1

Si recibe la caja inmediatamente después de descartar la alerta o la confirmación, eso no es extraño, eso es normal. confirm y alert detienen por completo la ejecución de JavaScript. La próxima llamada al temporizador se pondrá en cola esperando a que el intérprete vuelva a estar disponible, por lo que no me sorprende que no me ocupe de abrir el cuadro que muestra el mensaje. ¿Es ese el único comportamiento que estás viendo que es un problema?

+0

El problema es que si hace clic en el segundo enlace inmediatamente y cierra el cuadro de alerta inmediatamente, aparecerá un segundo cuadro de alerta que contiene "3 segundos pasados", incluso si hizo todo esto en menos de 3 segundos ... (¿Es comprensible este comentario?) –

+0

@Crowder - ¿IE/FFX suprime el "hilo" setTimeout cuando aparece un cuadro de alerta/confirmación, mientras que Chrome simplemente continúa el "hilo"? (Disculpe mi pereza - No tengo tiempo para verificar esto en mi máquina.) – DashK

+0

@Golmote: Sí, lo es. Nada cambia cuando aumenta el tiempo de espera. 3 segundos solo para la prueba. – egon