Не возвращает фокус в браузер после всплывающего предупреждения

#javascript #focus #keyboard-events

#javascript #фокус #клавиатура-события

Вопрос:

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

Тем не менее, у меня проблема. Каждый раз, когда pacman умирает (или игра заканчивается) Я всегда использую окно предупреждения, чтобы предупредить пользователя о том, что произошло. Тем не менее, после того, как я нажму кнопку OK, чтобы заставить pacman снова перемещаться, я должен щелкнуть окно браузера, чтобы оно реагировало на события клавиатуры.

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

Может кто-нибудь дать мне общие указания о том, каким могло бы быть решение для этого?

PS: При создании игры я использую изображения, созданные «на лету», имея на странице только 2 текстовых тега с идентификаторами.

РЕДАКТИРОВАТЬ: код, связанный с onkeyup:

функция muda_sentido(событие) {

   //baixo
  if(event.keyCode == 40)
  {
      pacman_status = status[2];
      imagem_pacman.src = "Imagens/pacmanb.gif";
      imagens[pacman_pos[0]][pacman_pos[1]].src = "Imagens/pacmanb.gif";
  }
  //direita
  else if(event.keyCode == 39)
  {
      pacman_status = status[0];

      imagem_pacman.src = "Imagens/pacmand.gif";
      imagens[pacman_pos[0]][pacman_pos[1]].src = "Imagens/pacmand.gif";
  }
  //cima
  else if(event.keyCode == 38)
  {
      pacman_status = status[3];
      imagem_pacman.src = "Imagens/pacmanc.gif";
      imagens[pacman_pos[0]][pacman_pos[1]].src = "Imagens/pacmanc.gif";
  }
  //esquerda
  else if(event.keyCode == 37)
  {
      pacman_status = status[1];
      imagem_pacman.src="Imagens/pacmane.gif"
      imagens[pacman_pos[0]][pacman_pos[1]].src = "Imagens/pacmane.gif";
  }
  

}

содержимое тела html представляет собой двойной тег h2 (не удается добавить его в формат кода, потому что он выглядит перепутанным в программе предварительного просмотра) с идентификатором для каждого.

И вокруг программы у меня есть что-то вроде:

предупреждение («Пакман умер!»)

И проблема после этого.

2 ПРАВКА: Удалось захватить фрагмент кода, который находится в окне предупреждения (просто изменил его сейчас, чтобы искать его только в одном месте):

функция pacman_morreu() {

     alert("O pacman morreu!");

    if(pacman_vidas==0)
    {
        alert("Game Over!");
        reinicia_tabuleiro();

    }
    else
    {
        pacman_vidas--;
        vidas.innerHTML = "Número de vidas: "  pacman_vidas;
    }
    pintaEcra();
}
  

Функции, перечисленные внутри кода, будут выполнять только операции манипулирования матрицей (ничего особенного на самом деле).

РЕДАКТИРОВАТЬ 3: Как и было запрошено, здесь идет:

функция reinicia_tabuleiro() {

     pacman_vidas = 3;
    vidas.innerHTML = "Número de vidas: 3";
    pontuacao.innerHTML = "Pontuação: 0";
    pontos = 0;
    for(i=1;i<24;i  )
    {
        for(j=1;j<24;j  )
        {
            if(tabuleiro[i][j] == 0)
                tabuleiro[i][j] = 2;
        }
    }


}
  

Комментарии:

1. Можете ли вы опубликовать js-код для этого?

2. Связано ли ваше onkeyup событие с window ?

3. и html для вашего w / e вашего события onkeyup связан с

4. По-прежнему неясно, к какому элементу привязано ваше onkeyup событие.

5. просто отредактировал мой вопрос. Посмотрите, есть ли в нем вся необходимая информация

Ответ №1:

Извини, чувак, я не вижу ничего, что могло бы вызвать это. Какой браузер вы используете? Я провожу аналогичные тесты в IE и FF и получаю фокус окна после нажатия кнопки «Ок» в окне предупреждения. Вы пробовали использовать Firebug? Это отличная программа для отладки javascript. Я бы настоятельно рекомендовал его для этого проекта pacman, который вы делаете. Возможно, где-то в вашем коде есть ошибка, которая вызывает это, что не очень заметно в коде, показанном выше.

Комментарии:

1. Я тестирую на FF4, и, к сожалению, я не могу запустить firebug, потому что в новой версии произошла утечка памяти…. В любом случае, я попытаюсь решить эту странную проблему

Ответ №2:

Ну, прямо сейчас у меня нет решения этой проблемы, но у меня есть обходной путь. Не используйте alertbox, используйте lightbox (div с более высоким значением z-index) и заставьте div показывать и скрывать на основе условия в javascript. Я надеюсь, что это поможет.

Ответ №3:

Я только что столкнулся с аналогичной проблемой с keydown и Firefox 5.0. Окно фокусируется при загрузке страницы, и все мои $(window).keydown(...) события работали нормально.

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

 $(window).blur(function(){
    setTimeout(function(){
        $(window).focus();
    }, 0);
});
  

Тайм-аут необходим, поскольку Firefox (и, возможно, другие браузеры) не позволит вам сразу сфокусироваться во время события размытия.

Это может иметь непреднамеренные последствия, поскольку вы практически никогда не позволяете окну размываться. Например, нажатие на панель местоположения даже не сработает, потому что окно немедленно вернет фокус обратно. Чтобы копать глубже, вы могли бы установить флаг «перефокусировать» для вашего обратного вызова, чтобы он знал, следует ли отказаться от фокуса или нет. Вот основная идея:

 var doRefocusWindow = false;

$(window).blur(function(){
    if(!doRefocusWindow) return;
    doRefocusWindow = false;
    setTimeout(function(){
        $(window).focus();
    }, 0);
});

...

doRefocusWindow = true;
alert("Game Over");