#javascript #jquery #bind
#javascript #jquery #привязка
Вопрос:
Я пишу фрагмент кода, который случайным образом меняет некоторые индикаторы на экране с красного на зеленый и ожидает, пока пользователь нажмет клавишу, соответствующую включенному индикатору.
Когда я запускаю этот код, вы можете нажать клавишу 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);
}
}
Комментарии:
1. Поместили ли вы какой-нибудь отладочный код в начале
keyPress
, чтобы убедиться, что он вообще не вызывается и что ошибка в привязке обработчика событий?2. Не могли бы вы привести нам рабочий пример или, по крайней мере, урезанный jsfiddle, который иллюстрирует проблему? Было бы действительно полезно увидеть это в действии.
Ответ №1:
Причина, по которой это может происходить, заключается в том, что при динамической генерации кода или изменении любого существующего кода привязку необходимо выполнить снова, потому что функция привязки выполняется только один раз и только для уже созданных элементов. Поэтому, когда вы создаете динамически код, вы вынуждены запускать функцию привязки для распознавания новых элементов.
этот способ не очень рекомендуется, вместо этого вы могли бы привязать контейнер типа ‘div’ или что-то в этом роде и внутри этого проверить, какой элемент вызывает вас. Это сработает, потому что ваш контейнер создается один раз, и привязка назначена правильно, и не имеет значения, изменяется ли содержимое вашего контейнера, привязка всегда работает.
С уважением
Комментарии:
1. Когда я запускаю код, нажатие клавиши срабатывает, но не во время выполнения кода. После этого она снова работает, но только если я выхожу из окна, а затем возвращаюсь в него. Завтра я представлю рабочий пример.
2. Я пытался поместить привязку в цикл и привязку к window, html и т.д., Но безрезультатно.
3. Я думаю, что, возможно, я нашел причину этого. Перед каждой вспышкой он воспроизводит звук, я удалил это, и теперь требуется нажатие клавиши. Есть идеи, почему звук влияет на это. Посмотрите здесь: performancetrainingdiary.com/reaction_test.html
Ответ №2:
Ответом было использование плагина jquery sound.
Исправлено с помощью этого: плагины.jquery.com/project/sound_plugin