canvas绑定键盘事件不会生效 + 解决办法

这篇具有很好参考价值的文章主要介绍了canvas绑定键盘事件不会生效 + 解决办法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

canvas绑定键盘事件不会生效

解决办法

1.如果canvas元素和windows长宽基本一致,可以通过在windows对象上绑定键盘事件来代替对canvas元素的监听与处理。

2.让canvas元素处于聚焦状态,并给它绑定键盘事件。


写贪吃蛇游戏时遇到一个问题:想的是给canvas绑定键盘事件,从而操作蛇的移动,但是绑定键盘事件后,却没有效果,然后给window绑定后就可以操操作蛇的移动了。不知道为啥?查阅资料后做出记录:

canvas绑定键盘事件不会生效

对于canvas元素,它支持javascript所有鼠标事件,但是如果监听键盘事件则并不会生效

<body>
    <style>
        #canvas {
            border: 1px solid skyblue;
        }
    </style>
    <canvas id="canvas" width="400" height="400"></canvas>
    <script>
        let canvas = document.querySelector('#canvas');
        //有效
        canvas.addEventListener('click', (e) => {
            console.log('触发点击了 鼠标事件有效')
        })
        //无效
        canvas.addEventListener('keydown', (e) => {
            console.log('触发按键了 键盘事件无效')
        })
    </script>
</body>

原因在于: 键盘输入事件只发生在当前 拥有焦点的HTML元素上 ,如果没有元素拥有焦点,那么事件将会上移至windows和document对象

解决办法

1.如果canvas元素和windows长宽基本一致,可以通过在windows对象上绑定键盘事件来代替对canvas元素的监听与处理。

        window.addEventListener('keydown', (e) => {
            console.log('触发按键了 键盘事件有效')
        })

2.让canvas元素处于聚焦状态,并给它绑定键盘事件。

<canvas tabindex="0"></canvas>

tabindex设置为0或更大

<body>
    <style>
        #canvas {
            border: 1px solid skyblue;
        }
    </style>
    <canvas id="canvas" width="400" height="400" tabindex="0"></canvas>
    <script>
        let canvas = document.querySelector('#canvas');
        //解决办法2 让canvas聚焦 且给canvas添加tabindex="0"属性
        canvas.focus()
        canvas.addEventListener('keydown', (e) => {
            console.log(`keyCode: ${e.keyCode}`)
        })
    </script>
</body>

分析::tabindex,聚焦的元素会有一层默认的外框,标识该元素处于聚焦状态

canvas绑定键盘事件不会生效 + 解决办法

如果不想要显示外框,可以通过css样式去除:

canvas:focus {
  outline:none;
}

整体代码:

<body>
    <style>
        #canvas {
            border: 1px solid skyblue;
        }

        #canvas:focus {
            outline: none;
        }
    </style>
    <canvas id="canvas" width="400" height="400" tabindex="0"></canvas>
    <script>
        let canvas = document.querySelector('#canvas');
        //解决办法2 让canvas聚焦 且给canvas添加tabindex="0"属性
        canvas.focus()
        canvas.addEventListener('keydown', (e) => {
            console.log(`keyCode: ${e.keyCode}`)
        })
    </script>
</body>

结果:

canvas绑定键盘事件不会生效 + 解决办法文章来源地址https://www.toymoban.com/news/detail-489021.html

到了这里,关于canvas绑定键盘事件不会生效 + 解决办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue按钮绑定回车(键盘事件)

    但是,这种方式只能在该按钮获取到光标之后才能绑定回车键,也就是说你需要先用鼠标点击一下触发绑定回车的操作。

    2024年02月16日
    浏览(51)
  • tkinter如何绑定鼠标和键盘等事件

    Tkinter系列: GUI初步💎布局💎绑定变量💎绑定事件💎消息框 扫雷小游戏💎强行表白神器 控件和人通过事件来交互, Tkinter 中则通过 Bind 来绑定事件。例如 效果如下 其中, bind 用于绑定事件,第一个参数 Button-1 在鼠标左键点击时触发,后面的 lambda 表达式为触发后的函数

    2024年02月11日
    浏览(46)
  • WPF中TextBox使用KeyBinding绑定命令,键盘事件

        最近在做一个扫码枪识别条形码的功能,TextBox文本按回车键或者是扫码枪识别条形码自动触发查询功能,由于架构采用的是MVVM的开发模式,所以,刚开始采用KeyBinding的方式绑定命令,然后实现该功能;代码如下: 对应的ViewModel中绑定命令事件,代码如下所示     初步

    2024年02月14日
    浏览(48)
  • Vue的数据绑定 事件 键盘 ,以及创建项目改端口号

    一、Vue的数据绑定 1、单向数据绑定:将Model绑定到View上,当通过JavaScript代码改变了Model时,View就会自动刷新。不需要进行额外的DOM 操作就可以实现视图和模型的联动 ​ a、数据只保存一份 ​ b、data—-DOM ​ (1)插值表达式:{{ 表达式 }},将表达式的值在View中显示出来 ​

    2024年02月12日
    浏览(44)
  • vue3和ts的el-input的键盘回车绑定事件

    el-input框绑定键盘回车搜索事件 加上@keyup.enter.native=\\\"search\\\" 然后   第二种方法:作用在input元素身上 在html中 然后

    2024年02月04日
    浏览(43)
  • WPF MvvM框架(MvvMLight,Microsoft Toolkit Mvvm,CommunityToolkit.Mvvm;鼠标,键盘,手写等事件绑定如:抬起按下事件)

    目录 1.MvvMLight(已废弃) 2. Microsoft Toolkit Mvvm(已废弃)  3.CommunityToolkit.Mvvm框架 4.Mvvm中的事件绑定 4.1 DataGrid表中按钮点击事件 4.2 绑定 鼠标事件,键盘事件,手写笔事件,多点触控事件 5.和PLC设备建立联系(联调)    本文中,继承接口,同步数据方法,command用法均一致; 1.继

    2024年02月04日
    浏览(60)
  • python图形界面化编程GUI(三)事件绑定(鼠标和键盘、OptionMenu、scale、颜色、文件对话框、菜单和工具栏、ttk子模块)

    Tkinter类 名称 简介 Toplevel 顶层 容器类,可用于为其他组件提供单独的容器,类似于窗口 Button 按钮 代表按钮组件 Canvas 画布 提供绘图功能,包括直线、矩形、椭圆、多边形、位图等 Entry 单行输入框 用户可输入内容 Frame 容器 用于装载其他GUI组件 Label 标签 用于显示不可编辑

    2024年02月12日
    浏览(45)
  • java修改版本不生效的解决办法

    1、jdk安装使用了.exe文件直接运行安装,这个不用配置环境变量,惠子动生成运行的文件, 2、现象, 修改环境变量不生效 3、解决办法 dos命令页——输入where java 将查到的文件按照路径删掉(不要删除安装的文件,删除自动生成的文件) 这里我删除了前两个的Oracle文件夹及

    2024年02月09日
    浏览(36)
  • canvas层级太高问题的解决办法

    因为canvas组件是由客户端创建的原生组件,原生组件层级是最高的,所以页面中的其他组件无论设置 z-index 为多少都无法盖在原生组件上。 1.html页面的处理 加上一个判断wx:if=“{{!canvasImg}}” 2.js页面的处理 (1)data中声明一个变量canvasImg (2)新增方法:处理canvas转化为图片

    2024年02月12日
    浏览(34)
  • IDEA中.gitignore文件不生效解决办法

    .gitignore文件不生效: .gitignore文件只会在第一次提交项目的时候写入缓存。 如果第一次提交项目时忘写.gitignore文件,后来再添加想要忽略的文件,.gitignore文件是不生效的。 原因: 因为在缓存中已经标记记录了该项目不存在gitignore文件了。 . 解决办法: 清除缓存文件 清楚完

    2024年02月16日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包