2010-09-24 7 views
8

J'ai cherché ici et trouvé une solution rapide pour appeler une action lorsque l'utilisateur est inactif sur la page. Cela fonctionne essentiellement sur tous les navigateurs. Mais lorsque j'utilise une alerte ou une boîte de dialogue de confirmation sur la page, le problème étrange se produit sur Google Chrome. Après la disparition de la boîte d'alerte ou de confirmation (appuyez sur OK, Annuler ou Croix), la fonction inactive fonctionne de manière inattendue.Problème étrange avec setTimeout() sur Google Chrome

  • Après la confirmation de la boîte ou une boîte d'alerte disparaît, qui venait de onclick est le lien, je les ai 3 secondes passé 'boîte immédiatement

testé sur FF, IE et Chrome (dernière). Cela se produit juste sur Chrome.

Mon code est ici: 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> 

Il semble que mon explication ne suffit pas:/

J'ai changé le code avec 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) 
    }) 
}); 

Lorsque je mets ce code sur ma page.Il fonctionne comme un charme. J'ouvre la page, fais des actions souris ou pas, puis 3 secondes sans bouger la souris, j'ai l'alerte ralenti. C'est ce dont j'ai besoin.

Lorsque je mets un lien qui appelle simplement une boîte d'alerte et cliquez dessus, la boîte d'alerte apparaît. Ensuite, je ferme la boîte et j'ai l'alerte au ralenti qui est '3 secondes passées'.

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

Cela se produit sur google chrome. Avec IE et FF tout va bien. Augmenter le délai, rien ne change.

+3

* "... la fonction inactive fonctionne de manière inattendue." * De manière inattendue ** comment **?!?! –

+3

Bienvenue dans StackOverflow. Contrairement à d'autres sites, l'un des objectifs est que StackOverflow soit autonome *. Par tous les moyens, établissez un lien vers des exemples vivants, comme vous l'avez fait, mais incluez le code que vous utilisez dans votre question (c'est pourquoi Yi Jiang l'a copié pour vous). La pourriture du lien peut s'installer facilement (les ressources externes sont supprimées, renommées, etc.) et de plus, les gens ne devraient pas avoir à aller ailleurs s'ils peuvent voir ce qui ne va pas avec la question elle-même. S'amuser! –

+0

@ T.J. Crowder, +1 pour le, fondamentalement, ** HULK SMASH !! ** = D –

Répondre

1

Si vous recevez la boîte immédiatement après avoir ignoré l'alerte ou la confirmation, ce n'est pas étrange, c'est normal. confirm et alert arrêter complètement l'exécution de JavaScript. Le prochain appel à la minuterie fera la queue en attendant que l'interprète redevienne disponible, donc le fait de ne pas ouvrir la boîte de message ne me surprend pas. Est-ce le seul comportement que vous voyez qui pose problème?

+0

Le problème est que si vous cliquez immédiatement sur le second lien, et fermez immédiatement la boîte d'alerte, une deuxième alerte apparaîtra, contenant "3 secondes passées", même si vous avez tout fait en moins de 3 secondes ... (Ce commentaire est-il compréhensible?) –

+0

@Crowder - Est-ce que IE/FFX supprime le "thread" setTimeout quand une boîte d'alerte/confirmation apparaît, alors que Chrome continue simplement le "thread"? (Excusez mon paresse - N'avez pas le temps de vérifier ceci sur ma machine.) – DashK

+0

@Golmote: Oui c'est. Rien ne change lorsque vous augmentez le délai d'expiration. 3 secondes juste pour le test. – egon