2011-05-03 57 views
0

我正在写一段代码,随机地将屏幕上的一些灯光从红色变为绿色,并等待用户点击对应于点亮的灯光的按键。jquery绑定不工作,而在一个JavaScript递归循环内

当我运行此代码时,您可以按a,d,j或l键并弹出警报。但是,只要我点击开始按钮,就不会识别任何按键。当循环结束时,绑定仍然显示为禁用。我尝试将绑定移动到其他地方,但我没有喜悦。非常感谢您的帮助。

$(function() { 
$('#start').bind('click', function() { main(); }); 
$(document).bind('keypress', function(e) { keyPress(e); }); 
}); 



function getRand(val) { 
    return Math.floor(Math.random()*val)+1; 
} 

function main() { 

preD = new Date; 
preDs = preD.getTime(); 
randTime=Math.floor(Math.random()*1001)+1500; 

playSound(); 
flash(); 
} 

function flash() { 

zone = getZone(); 

setTimeout(function() { 
    $('#r'+zone).css("background-image", "url(images/rea_grn.jpg)"); 
    setTimeout(function() { 
     $('#r'+zone).css("background-image", "url(images/rea_red.jpg)"); 
     if(cond[1] < 8) { 
      main(); 
     } 
    } , 200); 
} , randTime); 
} 

function getZone() { 

if(condition==1) { 
    zone = getRand(2); 
    if(test[1][zone] < 8) { 
     test[1][zone] += 1; 
     cond[1] += 1; 
     return zone; 
    } else { 
     getZone(); 
    } 
} 
} 

function keyPress(e) { 
var evtobj=window.event? event : e //distinguish between IE's explicit event object (window.event) and Firefox's implicit. 
var unicode=evtobj.charCode? evtobj.charCode : evtobj.keyCode 
var actualkey=String.fromCharCode(unicode) 
if (actualkey=="a" || actualkey=="d" || actualkey=="j" || actualkey=="l") { 
    dd = new Date; 
    reat = dd.getTime(); 
    alert(1); 
    //keypressed[condition][zone]['k']=actualkey; 
    //keypressed[condition][zone]['t']=(reat-preDs); 
} 
} 
+0

有你把某种在'keyPress'的开始调试代码,以确保它不会被调用所有与该故障是在事件处理程序结合的? – justkt 2011-05-03 17:32:31

+0

你可能给我们一个工作的例子,或者至少一个说明这个问题的简单的jsfiddle吗?看到它在行动将是非常有用的。 – 2011-05-03 17:40:53

回答

0

的原因,这可能发生,当你动态地生成代码或改变任何现有代码绑定需要重新做,因为函数绑定只运行一次,并只对已创建的成员。所以当你创建动态代码时,你不得不运行绑定函数来识别新的元素。

这种方式并不是非常值得推荐的,而不是这个,你可以绑定一个像'div'这样的容器,或者在这个元素的内部调用你的元素。这将起作用,因为您的容器只创建一次,并且绑定已正确分配,并且无论您的容器内容发生更改,绑定始终都能正常工作。

问候

+0

当我运行代码的按键工作,但不是在代码运行期间。之后它会再次运行,但只有当我切换出来然后再回到窗口时。明天我会举一个例子。 – karmafunk 2011-05-03 21:06:43

+0

我已经尝试把绑定内循环和绑定到窗口,HTML等。但也没有喜乐。 – karmafunk 2011-05-03 21:13:07

+0

我想我可能已经找到了导致它的事情。在每次闪光之前,它会播放声音,我已将其删除,现在需要按键。任何想法为什么声音对它有影响。看看这里:http://performancetrainingdiary.com/reaction_test.html – karmafunk 2011-05-04 07:20:28