警报弹出后不会将焦点返回到浏览器

时间:2011-04-14 00:19:50

标签: javascript focus keyboard-events

我正在尝试做一个小的pacman游戏来训练我的JavaScript技能。为了移动pacman,我使用与移动函数关联的onkeyup事件函数。

我还有问题。每当pacman死亡(或游戏结束)时,我总是使用警报框提醒用户发生的事情。仍然,按下OK按钮使pacman再次移动后,我必须单击浏览器窗口以使其响应键盘事件。

不知怎的,我相信这是一个Windows焦点问题,仍然,试图使用一些焦点(主要是在警报框之后)并且似乎没有做到这一点。

有人可以给我一些关于这个解决方案的一般指示吗?

PS:在游戏构造中,我使用的是动态创建的图像,页面上只有2个带有id的文本标签。

编辑: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标记(无法将其添加到代码格式,因为它在预览器中显得混乱),每个都有一个ID。

在程序中我有类似的东西:

  

警告(“吃豆子死了!”)

问题出在此之后。

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:根据要求,这里是:

  

function 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 :(得分:0)

抱歉,老兄,我没有看到任何导致这种情况的事。你使用的是什么浏览器?我正在对IE和FF进行类似的测试,并在警告框中单击“确定”后获得窗口焦点。您是否尝试过使用Firebug?这是一个调试javascript的好程序。我强烈推荐你正在做的这个pacman项目。您可能在代码中的某个位置出现错误,导致此错误在上面显示的代码中不是很明显。

答案 1 :(得分:0)

我刚刚遇到了keydown和Firefox 5.0的类似问题。当页面加载并且我的所有$(window).keydown(...)事件都正常工作时,窗口会聚焦。

然后在我显示警报后,没有事件发生。在我解除警报后,窗口不会自动聚焦。我能够通过强制窗口在模糊时重新聚焦来解决它。我使用jQuery所以这就是我的样子:

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

超时是必要的,因为Firefox(及其他浏览器)不会让你在模糊事件中立即聚焦。

这可能会产生意想不到的后果,因为您基本上不会让窗口模糊。例如,单击位置栏甚至无法工作,因为窗口会立即拉回焦点。要挖一个更深的洞,你可以设置一个重新聚焦&#34;你的回调标志,所以它知道是否放弃焦点。这是基本的想法:

var doRefocusWindow = false;

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

...

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

答案 2 :(得分:0)

那么现在,我没有解决这个问题,但我有一个解决方法。 不要使用alertbox,使用lightbox(具有更高z-index值的div)并根据javascript中的条件进行div显示和隐藏。 我希望这会有所帮助。