Привязка Jquery не работает в рекурсивном цикле JavaScript - PullRequest
0 голосов
/ 03 мая 2011

Я пишу фрагмент кода, который случайным образом меняет некоторые индикаторы на экране с красного на зеленый и ждет, когда пользователь нажмет клавишу, соответствующую индикатору.

Когда я запускаю этот код, вымогут нажать клавиши 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);
}
}

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Использование звукового плагина jquery было ответом.

Исправлено это с помощью: plugins.jquery.com/project/sound_plugin

0 голосов
/ 03 мая 2011

Причина, по которой это может происходить, заключается в том, что когда вы генерируете код динамически или изменяете любой существующий код, привязка должна быть выполнена снова, потому что функция привязки запускается только один раз и только для уже созданных членов. Поэтому, когда вы создаете динамический код, вы вынуждены запускать функцию привязки для распознавания новых элементов.

этот способ не очень рекомендуется, вместо этого вы можете связать контейнер как 'div' или что-то еще, и внутри этой проверки, какой элемент вызывает вас. Это будет работать, потому что ваш контейнер создан один раз, и привязка назначена правильно, и не имеет значения, изменяется ли содержимое вашего контейнера, привязка всегда работает.

Привет

...