需求:在某一网页,通过上下左右键控制一些操作

实现:

1.基本代码:

因为没有绑定特定的元素.所以我们将事件绑定到document上.

  1. //当前页面监视键盘输入
  2. document.onkeydown = function(e) {
  3. console.log('键盘输入了')
  4. //事件对象兼容
  5. let e1 = e || event || window.event || arguments.callee.caller.arguments[0]
  6. //键盘按键判断:左箭头-37;上箭头-38;右箭头-39;下箭头-40
  7. //左
  8. if (e1 && e1.keyCode == 37) {
  9. this.decrease()
  10. } else if (e1 && e1.keyCode == 38) {
  11. this.nowStudent--
  12. } else if (e1 && e1.keyCode == 39) {
  13. this.increase()
  14. } else if (e1 && e1.keyCode == 40) {
  15. this.nowStudent++
  16. }
  17. }

2.何时何处绑定:

其他绑定特定元素的函数,都是直接绑定在行内,也就是说创建时就绑定了

  1. <input @keyup.enter="function">

而我们则需要把这个事件绑定过程放在created钩子中,理由很简单.在这个钩子里可以确定你想绑定的元素已经构建完成

  1. created() {
  2. this.getHomework()
  3. //当前页面监视键盘输入
  4. document.onkeydown = function(e) {
  5. console.log('键盘输入了')
  6. //事件对象兼容
  7. let e1 = e || event || window.event || arguments.callee.caller.arguments[0]
  8. //键盘按键判断:左箭头-37;上箭头-38;右箭头-39;下箭头-40
  9. //左
  10. if (e1 && e1.keyCode == 37) {
  11. this.decrease()
  12. } else if (e1 && e1.keyCode == 38) {
  13. this.nowStudent--
  14. } else if (e1 && e1.keyCode == 39) {
  15. this.increase()
  16. } else if (e1 && e1.keyCode == 40) {
  17. this.nowStudent++
  18. }
  19. }
  20. },

3.this指向修正

完成以上两步,还不行.会报错.this.getHomework正常,console.log也会执行,但是onkeydown的this会出错.

  1. Uncaught TypeError: this.decrease is not a function

原因是created钩子里的this是vue对象,但是,onkerdown这个函数本身又形成了一个"作用域",this指向了调用onkeydown的对象.而onkeydown里面的decrease()是methods里面的一个函数,所以this的指向出错

解决方案

用一个全局变量把this保存起来再用

  1. created() {
  2. this.getHomework()
  3. var that = this
  4. //当前页面监视键盘输入
  5. document.onkeydown = function(e) {//事件对象兼容
  6. let e1 = e || event || window.event || arguments.callee.caller.arguments[0]
  7. //键盘按键判断:左箭头-37;上箭头-38;右箭头-39;下箭头-40
  8. //左
  9. if (e1 && e1.keyCode == 37) {
  10. that.decrease()
  11. } else if (e1 && e1.keyCode == 38) {
  12. that.nowStudent--
  13. } else if (e1 && e1.keyCode == 39) {
  14. that.increase()
  15. } else if (e1 && e1.keyCode == 40) {
  16. that.nowStudent++
  17. }
  18. }
  19. }

vue在某页面监听键盘输入事件的更多相关文章

  1. [C#]非阻塞监听键盘输入

    摘要 最近需要调研监控用户键盘输入的内容,然后收集数据进行用户行为分析.然后就用控制台程序弄了一个demo. 代码如下 class Program { static void Main(string[ ...

  2. 如何在ArcMap中监听键盘鼠标事件(转)

    如何在ArcMap中监听键盘鼠标事件(转) Link: http://www.cnblogs.com/dyllove98/p/3155551.html 昨天有个朋友想要实现一个功能,就是在ArcMap ...

  3. vue 监听键盘回车事件 @keyup.enter || @keyup.enter.native

    vue运行为v-on在监听键盘事件时,添加了特殊的键盘修饰符:\ <input v-on:keyup.13="submit"> vue还非常贴心地给出了常用按键的别名, ...

  4. 如何在ArcMap中监听键盘鼠标事件

    昨天有个朋友想要实现一个功能,就是在ArcMap中编辑数据的时候,能够通过快捷键自动设置预定义的属性,比如,选中若干要素,按A键,就自动填充属性,按B键,则又自动填充另外的属性字段. 单就这个功能而言 ...

  5. java 图形化工具Swing 监听键盘输入字符触发动作getInputMap();getActionMap();

    双缓冲技术的介绍: 所有的Swing组件默认启用双缓冲绘图技术.使用双缓冲技术能改进频繁重绘GUI组件的显示效果(避免闪烁现象)JComponent组件默认启用双缓冲,无须自己实现双缓冲.如果想关闭双 ...

  6. Vue监听键盘回车事件

    在写页面时遇见了登录页需要加一个键盘回车事件. vue 的 v-on中有这样的修饰符 <input v-on:keyup.enter="submit"> 即<in ...

  7. js及vue监听键盘回车事件

    js document.onkeydown = (event) => { var e = event || window.event; if(e && e.keyCode==13 ...

  8. 【土旦】vue 解决ios H5底部输入框 获取焦点时弹出虚拟键盘挡住输入框 以及监听键盘收起事件

    问题描述 im聊天H5页面,在iOS系统下,inpu获取焦点弹出系统虚拟键盘时,会出现挡住input的情况,十分影响用户体验. bug图 解决方法: html: <input type=&quo ...

  9. Winform下WebBrowser 编辑模式 监听键盘按键事件

    最近使用 WebBrowser 做了个富文本编辑器(其实网上有很多很多).例如下面这个玩意(不要在意界面神马的) WebBrowser在编辑模式下可以有一些HTML标签的功能,改变字体大小颜色等等等. ...

随机推荐

  1. 菜鸡的Java笔记 第二十八 - java 包的定义

    包的主要作用以及定义    包的导入操作    系统常见的开发包    jar 程序命令        包的定义        在任何的操作系统之中都有一个统一的共识:同一个目录下不能够存在有相同的文 ...

  2. 『学了就忘』Linux软件包管理 — 47、Linux源码包的安装和卸载

    目录 1.源码包安装服务的注意事项 2.源码包安装服务的过程 3.源码包安装服务的删除 4.源码包安装服务的启动 5.源码包安装服务的关闭 1.源码包安装服务的注意事项 (1)安装服务选择哪种软件包? ...

  3. Unity Ioc 类型初始值设定项引发异常,The type name or alias SqlServer could not be resolved. Please check your configuration file and verify this type name.

    先看一下unity的配置信息 <unity> <typeAliases> <typeAlias alias="IDatabase" type=&quo ...

  4. [loj3272]汉堡肉

    当$k\le 3$,这是一个经典的问题 设所有矩形左下角横纵坐标的最大值为$(x_{1},y_{1})$,右上角横纵坐标的最小值为$(x_{2},y_{2})$,那么必然存在一组合法解满足其中一点为$ ...

  5. 【IDEA】头注释和方法注释

    头注释和方法注释 2020-09-08  10:16:17  by冲冲 1.头注释 ①设置 ②模板内容 /** * @ClassName ${NAME} * @Description ${DESCRI ...

  6. 调试:'Object reference note set to an instance of an object.'

    今天调试代码遇到一个奇怪的问题,每次调试到 var files = new List<string>()这一行代码,总是报错:System.NullReferenceException: ...

  7. pechkin 导出https路径的图片

    使用Pechkin.Synchronized可以方便导出html为pdf,但是对于https路径的图片并不支持,仅支持http路径下的图片 解决方案:图片使用本地绝对路径(相对于服务器) 以下是我获取 ...

  8. java 单例模式实现代码

    目录 1.使用静态内部类实现 2.使用枚举实现 3.序列化与反序列化 1.使用静态内部类实现 使用静态内部类实现单例模式,线程安全 class SingletonStaticInner { priva ...

  9. 【软连接已存在,如何覆盖】ln: failed to create symbolic link ‘file.txt’: File exists

    ln -s 改成 ln -sf f在很多软件的参数中意味着force ln -sf /usr/bin/bazel-1.0.0 /usr/bin/bazel

  10. Xwiki——实现

    基于CentOS6.9 yum install java wget http://download.forge.ow2.org/xwiki/xwiki-enterprise-installer-gen ...