2011-10-31 32 views
1

我正在一个项目中,我在网站上显示的内容用户可以使用按键W或P“交互”。做到这一点,该网站执行一个函数张贴到一个PHP写入一个的MySQL数据库。但是,如果连续按下按键并按下多次 - 我会运行多个setTimeouts并发生垃圾。 如何在执行一次时临时删除运行(或禁用)按键功能的访问?暂时删除访问执行功能

<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <script language="javascript" type="text/javascript" src="jquery-1.6.4.min.js"></script> 
     <script language="javascript" type="text/javascript" src="jquery.jkey-1.2.js"></script> 
     <link rel="stylesheet" href="custom.css"> 
     <script> 

$(function content(){ 
var reloading = function(data){ 
     $.ajax({          
     url: 'api.php',       
     data: "",      
     dataType: 'json',      
     success: function(data)   
     { 
     var id = data[0];    
      _id = id; 
     var vname = data[1];   
     var message = data[2]; 
     var field1 = data[3]; 
     _field1 = field1; 
     var field2 = data[4]; 
     _field2 = field2; 
     var ans1 = data[5]; 
     _ans1 = ans1; 
     var ans2 = data[6]; 
     _ans2 = ans2; 
     var val1 = parseInt(ans1, 10) ; 
     _val1 = val1; 
     var val2 = parseInt(ans2, 10) ; 
     _val2 = val2; 

     $('#output').hide().html(message).fadeIn("slow"); 
     $('#username').hide().html("@"+vname +":").fadeIn("slow"); 
     $('#valg1').hide().html(field1 ).fadeIn("slow"); 
     $('#valg2').hide().html(field2 ).fadeIn("slow"); 
    window["reload_timer"] = setTimeout(reloading,6000); 
} 
     }); 
    } 
    reloading(); 

    $(document).jkey('p',function() { 
    $.post("update.php", { "id": _id}) 
     $('#output').hide().html("<i>Thx!</i><).fadeIn("slow"); 
     $('#username').fadeOut("fast"); 
     $('#valg1').fadeOut("fast"); 
     $('#valg2').fadeOut("fast"); 
     clearTimeout(window["reload_timer"]); 
     setTimeout(reloading,5000); 
     }); 
     $(document).jkey('w',function() { 
    $.post("update.php", { "id2": _id}) 
     $('#output').hide().html("<i>Thx!</i><).fadeIn("slow"); 
     $('#username').fadeOut("fast"); 
     $('#valg1').fadeOut("fast"); 
     $('#valg2').fadeOut("fast"); 
     clearTimeout(window["reload_timer"]); 
     setTimeout(reloading,5000); 
     }); 
     }); 
</script> 

</head> 
    <body><div id="container"> 
     <div id="username"> 
</div> 
    <div id="output"></div> 
    <div id="posted"></div> 
    <div id="field1"></div> 
<div id="valg1"></div> 
     <div id="valg2"></div> 
     </div> 

</body> 
</html> 

回答

3

引入一个变量,例如, blocked

var blocked = false; 

在按键处理,中止如果封锁和阻止设置为true,否则:

$(document).jkey('w',function() { 
    if(blocked) return; // abort 
    blocked = true; // disallow any further key presses 

阻止在reloading的成功处理程序:

success: function() { 
    blocked = false; // allow again 
+0

谢谢你,完美的工作! – user977101

2

添加标记和请在两个按键处理程序中检查它:

var allowKeyPress = true; 

$(document).jkey('p',function() { 
    if (!allowKeyPress) 
     return; 

    allowKeyPress = false; 

    // your existing code here 
} 

别的地方在你的代码,然后重新设定allowKeyPress = true; - 我不知道究竟要做到这一点:也许在您reloading()功能,也许在成功回调从$.ajax()(在这种情况下,你真的应该添加一个错误或完整的处理程序来重置标志,如果ajax调用失败),或者可能只是一个新的,单独的setTimeout()