Javascript 禁用用户浏览器中的箭头键滚动
我正在用画布和javascript制作一个游戏 当页面比屏幕长(评论等)时,按下向下箭头将向下滚动页面,使游戏无法进行 当播放器只想向下移动时,如何防止窗口滚动 我想对于Java游戏,这不是问题,只要用户点击游戏 我尝试了以下解决方案:,但无法使其正常工作。Summary 只需浏览器操作:Javascript 禁用用户浏览器中的箭头键滚动,javascript,canvas,scroll,arrow-keys,Javascript,Canvas,Scroll,Arrow Keys,我正在用画布和javascript制作一个游戏 当页面比屏幕长(评论等)时,按下向下箭头将向下滚动页面,使游戏无法进行 当播放器只想向下移动时,如何防止窗口滚动 我想对于Java游戏,这不是问题,只要用户点击游戏 我尝试了以下解决方案:,但无法使其正常工作。Summary 只需浏览器操作: window.addEventListener("keydown", function(e) { if(["Space","ArrowUp"
window.addEventListener("keydown", function(e) {
if(["Space","ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].indexOf(e.code) > -1) {
e.preventDefault();
}
}, false);
如果您需要支持Internet Explorer或其他旧浏览器,请使用e.keyCode
而不是e.code
,但请记住,并且您需要使用实际代码而不是字符串:
//不推荐使用的代码!
window.addEventListener(“向下键”,函数(e){
//空格键和箭头键
if([32,37,38,39,40].indexOf(e.keyCode)>-1){
e、 预防默认值();
}
},假);
原始答案
我在自己的游戏中使用了以下功能:
var keys = {};
window.addEventListener("keydown",
function(e){
keys[e.code] = true;
switch(e.code){
case "ArrowUp": case "ArrowDown": case "ArrowLeft": case "ArrowRight":
case "Space": e.preventDefault(); break;
default: break; // do not block other keys
}
},
false);
window.addEventListener('keyup',
function(e){
keys[e.code] = false;
},
false);
魔法发生在你的身体里。这将阻止事件的默认操作,在这种情况下,移动浏览器的视点
如果您不需要当前按钮状态,只需放下键
,然后放弃箭头键上的默认操作:
var arrow_keys_handler = function(e) {
switch(e.code){
case "ArrowUp": case "ArrowDown": case "ArrowLeft": case "ArrowRight":
case "Space": e.preventDefault(); break;
default: break; // do not block other keys
}
};
window.addEventListener("keydown", arrow_keys_handler, false);
请注意,如果需要重新启用箭头键滚动,此方法还允许您在以后删除事件处理程序:
window.removeEventListener("keydown", arrow_keys_handler, false);
工具书类
- MDN:
- MDN:
- MDN:接口
window.event.preventDefault()
?国家:
window.event
是Microsoft Internet Explorer的专有属性
它仅在调用DOM事件处理程序时可用。它的
值是当前正在处理的事件对象
进一步阅读:
甚至是
window.addEventListener
的显式{passive:false}
属性,例如,建议将其作为唯一的工作解决方案
最后,经过多次尝试,我找到了一种在Firefox和Chrome中都适用的方法:
window.addEventListener('keydown',(e)=>{
if(e.target.localName!=“input”){//如果需要筛选元素
开关(如钥匙代码){
案例37://左
案例39://对
e、 预防默认值();
打破
案例38://以上
案例40://向下
e、 预防默认值();
打破
违约:
打破
}
}
}, {
capture:true,//这将禁用现代Chrome中的箭头键滚动
被动:false//这是可选的,我的代码在没有它的情况下工作
});
引用来自的EventTarget.addEventListener()
选项可选选项对象指定有关事件侦听器的特征。可供选择的方案有: 捕获
一个
布尔值
,指示此类型的事件将被分派到注册的侦听器
,然后再分派到DOM树中其下的任何事件目标。
一次
…
被动的
一种布尔值
,如果为true,则表示侦听器
指定的函数永远不会调用preventDefault()
。如果被动侦听器调用了preventDefault()
,则用户代理除了生成控制台警告之外,不会执行任何操作
我非常喜欢这个解决方案,但它在chrome=/@Kaninepete中似乎不起作用:出现语法错误,我在keyup侦听器中使用了lC.keys
而不是keys
。修复了此问题,并在Firefox和Chrome中进行了测试。请注意,对键的所有更改都是可选的,但由于您正在构建游戏…如果您这样做,并且您的网页上有任何字段输入,则您将无法使用空格键或箭头键来导航文本。我发现了一个很大的缺点。请注意,您确实需要使用keydown
而不是keydup
。这在chrome中仍然不起作用:(撕开我的蛇游戏
theCanvas.onkeydown = function (e) {
if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {
e.view.event.preventDefault();
}
}