Не возвращать фокус в браузер после всплывающего окна с предупреждением - PullRequest
0 голосов
/ 14 апреля 2011

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

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

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

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

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 (его нельзя добавить в формат кода, так как он выглядит испорченным в программе предварительного просмотра) с идентификатором.

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

alert («Пакман умер!»)

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

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;
        }
    }


}

Ответы [ 3 ]

0 голосов
/ 09 июля 2011

Я только что столкнулся с подобной проблемой с 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");
0 голосов
/ 09 июля 2011

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

0 голосов
/ 14 апреля 2011

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

...