2012-04-06 91 views
0

我想在一个键盘命令后将“mouseactive”设置为不到一秒,但是如果在该时间段内按下该键,我想取消该操作。但我似乎无法弄清楚如何做到这一点。这是我有...清除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; 
} 

但是,这并不工作,它不设置mouseactive回真的......谁能告诉我什么,我做错了什么?

回答

2

编辑:清理冗余代码。

更多编辑:确保您的var t被定义为包括$(document).ready在内的任何关闭。见下面,

var t = null; 

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

在处理程序外部声明var t。

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

你不应该将字符串传递给'setTimeout',你应该传递函数。它在字符串传递时使用'eval'。 't = setTimeout(mouseActive,800);' – 2012-04-06 20:50:51

+0

@火箭mm ..我刚刚清理了他的代码..也包括在清理中..谢谢!在清理之前,我在最初的帖子中将其作为字符串。 – 2012-04-06 20:51:30

+0

谢谢,这个伎俩,非常感谢。 – Ian 2012-04-06 21:16:36

1

你重新声明“T”的时候,试试这个:

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

您不应该将字符串传递给'setTimeout',您应该传递函数。它在字符串传递时使用'eval'。 't = setTimeout(mouseActive,800);' – 2012-04-06 20:50:59

2

您的问题是t不在范围内的第二次函数运行。你需要使t成为一个全局变量。

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.不要将字符串传递给setTimeout,传递函数。它在传递字符串时使用eval

+0

很奇怪,当我不使用“var”时,那么整个事情就会中断... – Ian 2012-04-06 20:58:27

+0

Nvm,那是因为我之前没有用“var t”来定义它。谢谢 – Ian 2012-04-06 21:00:01

+0

不客气:-) – 2012-04-06 21:07:19