2012-04-06 2 views
0

J'essaie de définir "mouseactive" sur true moins d'une seconde après un raccourci clavier, mais je souhaite annuler cette action si la touche est enfoncée pendant cette période. Cependant, je n'arrive pas à comprendre comment faire cela. Voilà ce que j'ai ...Résolution des problèmes setTimeout

$(window).keydown(function(e) { 
if (e.keyCode == 40) { 
     e.preventDefault(); 
     mouseactive = false; 
     clearTimeout(t); 
     var t = setTimeout("mouseActive()",800); 
} else if (e.keyCode == 38) { 
     e.preventDefault(); 
     mouseactive = false; 
     clearTimeout(t); 
     var t = setTimeout("mouseActive()",800); 
} 
}); 

function mouseActive() { 
mouseactive = true; 
} 

Mais cela ne fonctionne pas, il ne précise pas mouseactive sur true ... quelqu'un peut me dire ce que je fais mal ici?

Répondre

2

Édition: Code redondant nettoyé.

Plus: Edits Assurez-vous que votre var t est défini en dehors de toute fermeture, y compris $(document).ready. Voir ci-dessous,

var t = null; 

$(document).ready(function() { 
    //..below code except for var t = null 
}); 

Déclarez l'extérieur du gestionnaire.

var t = null; 
$(window).keydown(function(e) { 
    e.preventDefault(); 

    if (e.keyCode == 40) { 
     mouseactive = false; 
    } else if (e.keyCode == 38) { 
     mouseactive = false; 
    } 

    if (t != null) clearTimeout(t); 
    t = setTimeout(mouseActive, 800); 
}); 

function mouseActive() { 
    mouseactive = true; 
} 
+0

Vous ne devriez pas passer de chaînes à 'setTimeout', vous devriez passer des fonctions. Il utilise 'eval' quand une chaîne est passée. 't = setTimeout (mouseActive, 800);' –

+0

@Rocket mm .. Je viens de nettoyer son code .. que trop inclus dans le nettoyage .. Merci! Je l'ai eu comme chaîne dans mon message initial avant le nettoyage. –

+0

Merci, cela a fait l'affaire, très apprécié. – Ian

1

vous redéclarant « t » tout le temps, essayez ceci:

var t = null; 
$(window).keydown(function(e) { 
    if (e.keyCode == 40) { 
      e.preventDefault(); 
      mouseactive = false; 
      if(t != null) 
      { 
       clearTimeout(t); 
      } 
      t = setTimeout("mouseActive()",800); 
    } else if (e.keyCode == 38) { 
      e.preventDefault(); 
      mouseactive = false; 
      if(t != null) 
      { 
       clearTimeout(t); 
      } 
      t = setTimeout("mouseActive()",800); 
    } 
    }); 

    function mouseActive() { 
    mouseactive = true; 
    } 
+0

Vous ne devriez pas passer des chaînes à 'setTimeout', vous devriez passer des fonctions. Il utilise 'eval' quand une chaîne est passée. 't = setTimeout (mouseActive, 800);' –

2

Votre problème est que t n'est pas portée la 2ème fois que la fonction est exécutée. Vous devez faire t une variable globale.

var t; 

$(window).keydown(function(e) { 
if (e.keyCode == 40) { 
     e.preventDefault(); 
     mouseactive = false; 
     clearTimeout(t); 
     t = setTimeout(mouseActive,800); 
} else if (e.keyCode == 38) { 
     e.preventDefault(); 
     mouseactive = false; 
     clearTimeout(t); 
     t = setTimeout(mouseActive,800); 
} 
}); 

function mouseActive() { 
mouseactive = true; 
} 

P.S. Ne transmettez pas les chaînes à setTimeout, passez les fonctions. Il utilise eval lorsque vous passez des chaînes.

+0

Eh bien assez curieusement quand je n'utilise pas "var" alors tout se casse ... – Ian

+0

Nvm, c'est parce que je ne l'ai pas défini avec le "var t" avant . Merci – Ian

+0

De rien :-) –

Questions connexes