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

Javascript 弹出警报后不将焦点返回浏览器,javascript,focus,keyboard-events,Javascript,Focus,Keyboard Events,我正在尝试做一个小的吃豆人游戏来训练我的JavaScript技能。为了移动pacman,我使用了与move函数关联的onkeyup事件函数 我仍然有一个问题。每次吃豆人死亡或游戏结束时,我总是使用一个警报框来提醒用户发生了什么。不过,在我按下OK按钮让pacman再次移动之后,我必须单击浏览器窗口,使其对键盘事件做出响应 不知何故,我认为这是一个windows焦点问题,尽管如此,我还是尝试在警报框之后使用一些焦点,但似乎没有奏效 有没有人能给我一些关于解决这个问题的一般性建议 PS:在游戏结构中

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

我仍然有一个问题。每次吃豆人死亡或游戏结束时,我总是使用一个警报框来提醒用户发生了什么。不过,在我按下OK按钮让pacman再次移动之后,我必须单击浏览器窗口,使其对键盘事件做出响应

不知何故,我认为这是一个windows焦点问题,尽管如此,我还是尝试在警报框之后使用一些焦点,但似乎没有奏效

有没有人能给我一些关于解决这个问题的一般性建议

PS:在游戏结构中,我使用动态创建的图像,页面上只有两个id为的文本标签

编辑:onkeyup中关联的代码:

功能muda_sentidoevent {

}

html正文内容是一个双h2标记,无法将其添加到代码格式中,因为它在预览器上以每个ID显示

在这个项目中,我有一些类似的东西:

吃豆人死了

问题是在这之后

2编辑:设法抓取位于警报框中的代码片段,现在将其更改为仅在一个位置查找:

功能pacman_morreu {

代码中列出的函数只执行矩阵操作,实际上没有什么特别的

编辑3:根据要求,如下所示:

功能reinicia_tabuleiro {


抱歉,伙计,我没有看到任何可能导致此问题的原因。你使用的浏览器是什么?我正在对IE和FF进行类似的测试,并在单击警报框中的“确定”后获得窗口焦点。你尝试过使用吗?这是调试javascript的一个很棒的程序。我强烈建议你使用它进行pacman项目。你可能有一个n导致这种情况的代码中的某个错误在上面显示的代码中不是很明显。

我刚刚遇到了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");

现在,我没有解决这个问题的办法,但我有一个解决办法。 不要使用alertbox,使用z索引值较高的lightboxdiv,并根据javascript中的条件显示和隐藏该div。
我希望这会有所帮助。

你能发布这方面的js代码吗?你的onkeyup事件是否绑定到了Windows?以及你的w/e的html你的onkeyup事件是否与之关联?仍然不清楚你的onkeyup事件绑定到了哪个元素。刚刚编辑了我的问题。看看它是否包含了所有需要的信息我正在FF4上测试,不幸的是我无法让firebug运行NIng vause新版本有内存泄漏…无论如何,我会设法解决这个奇怪的问题
    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;
        }
    }


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

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

...

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