4

这是一个问题 22,我真的不知道如何解决。以我们托管的这款 HTML5 游戏为例:

http://www.scirra.com/arcade/action/93/8-bits-runner - 警告有声音!

该页面托管在该页面上,但出于安全原因scirra.com,该游戏位于 iframe 中。static1.scirra.net

现在,如果您在玩游戏时按左、右、上或下,整个窗口会上下、左右滚动。当游戏没有集中注意力时,阻止默认值似乎可以正常工作。我们当然希望在玩游戏时阻止这种默认操作!所以我们使用代码:

    var ar = new Array(32, 33, 34, 35, 36, 37, 38, 39, 40, 44);
    $(document).keydown(function (e) {            
        var key = e.which;
        if ($.inArray(key, ar) > -1) {
                e.preventDefault();
                return false;
        }
        return true;
    });

我们把它放在父页面和 iframe 页面上。当 iframe 具有左右焦点时,似乎被阻止了,但不是up and down.

谁能帮助我们解决如何停止页面滚动,并且仍然允许人们在游戏下方的评论框中输入评论?如果您阻止空格键,它会阻止人们在他们的文本中添加空格!

4

5 回答 5

5

我可能不完全理解这个问题,但似乎你想要:

  1. 向上,向下,空间等只有在具有焦点时才进入游戏窗口。
  2. 向上,向下,空格等,以在具有焦点时转到评论框。
  3. 向上、向下、空格等以在获得焦点时转到主窗口。

如果您什么都不做,数字 #2 和 #3 会自动发生。所以基本上你想要#1。我不明白为什么您需要主窗口上的任何代码。

在我的测试中,这适用于 Chrome、Opera、FF、IE9、IE8、IE7。

主窗口

演示:http: //jsfiddle.net/ThinkingStiff/Dp5vK/

HTML:

<iframe id="game" src="http://jsfiddle.net/ThinkingStiff/dtmxy/show/"></iframe>
<textarea id="comment-box"></textarea>

CSS:

#game {
    border: 1px solid red;
    display: block;
    height: 100px;
    width: 200px;
}

#comment-box {
    height: 100px;
    width: 200px;
}

body {
    height: 1000px;
    width: 1000px;
}

游戏窗口 (iframe)

演示:http: //jsfiddle.net/ThinkingStiff/dtmxy/

脚本:

$( document ).bind( 'keydown', function ( event ) {

    var keys = [32, 33, 34, 35, 36, 37, 38, 39, 40, 44];

    if( keys.indexOf( event.which ) > -1 ) {

        event.preventDefault();
        event.stopPropagation();

    };

} );
于 2011-12-10T23:31:17.457 回答
1

当您将其更改为仅捕获游戏 div 时,看看它是否有帮助。

$('div.arcade-content').on('keydown', 'div.game-wrapper', function (e) {
    ...
});
于 2011-12-05T19:48:09.783 回答
1

关于空格键问题,如果用户只关注游戏下方的评论框,您必须检查您的 keydown 功能。如果它集中,则暂时允许空格键。

于 2011-12-09T11:09:53.227 回答
1

给你的游戏画布一个tabindex. 值 0 会将画布元素置于基于源的常规 Tab 键顺序。然后它将能够接收焦点并充当关键事件的目标,这意味着您可以阻止仅源自您的画布的关键事件的默认操作和事件传播。

$canvas = $("#c2canvas");
$canvas.tabIndex = 0;

var ar = [32, 33, 34, 35, 36, 37, 38, 39, 40, 44];
$canvas.keydown(function (e) {            
    var key = e.which;
    if ($.inArray(key, ar) > -1) {
        e.preventDefault();
        e.stopPropagation();
    }
});
于 2011-12-09T14:49:27.847 回答
0

我在将 iframe 中的游戏嵌入到 Wordpress 内容页面时遇到了同样的问题。preventDefault()遗憾的是,上述解决方案不适stopPropagation()用于 keydown keyCodes。所以我用一个切换到body的css类解决了这个问题,overflow: hidden并通过keydown设置/取消设置iframe焦点或通过鼠标滚轮滚动页面。

document.addEventListener('keydown', function(e) {
  document.body.classList.add('no-scroll');
  document.getElementsByTagName('iframe')[0].focus();
});
document.addEventListener('wheel', function(e) {
    document.body.classList.remove('no-scroll');
    if (document.activeElement) {
        document.activeElement.blur();
    }
});
.no-scroll {
    overflow: hidden;
}

这是工作示例:Boulder Dash

于 2020-05-06T21:06:38.863 回答