Jquery绑定在javascript递归循环中不工作

Jquery bind not working while within a javascript recursive loop

本文关键字:工作 循环 递归 绑定 javascript Jquery      更新时间:2023-09-26

我正在写一段代码,它将屏幕上的一些灯随机地从红色变为绿色,并等待用户按下对应于灯亮的键。

当我运行这段代码时,你可以按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);
}
}

可能发生这种情况的原因是,当您动态生成代码或更改任何现有代码时,绑定需要再次执行,因为要绑定的函数只运行一次,并且只针对已经创建的成员。因此,当您创建动态代码时,您被迫运行绑定函数来识别新元素。

这种方式不是很推荐,相反,你可以绑定一个像'div'之类的容器,在这个里面验证是哪个元素在调用你。这是有效的,因为你的容器只创建一次,并且绑定是正确分配的,如果容器的内容发生变化,绑定总是有效的。

使用jquery声音插件是答案。

修复:plugins.jquery.com/project/sound_plugin