在 Javascript 中处理多个按键事件的最佳方法是什么?

2024-04-02

游戏中按空格键会进行角色射击,出现确认框时按空格键会使该框消失,高分形式按空格键会在输入框中添加一个空格。在此示例中,同一键有多个事件,但一次仅触发一个事件。

是否有通用(或特定于Javascript)方法或编程方式将事件添加到某个键,以便它们仅在某些情况下执行?

当然可以这样做:

var inGame = true|false;
var inConfirmationBox = true|false;

function spaceBarHandler(){
    if(inGame){ /*shoot*/}
    else if(inConfirmationBox){ /*remove box*/}
}

document.onkeydown = function(){ /* call space bar handler if space bar was pressed */ };

但这是一种非常令人困惑的编程方式,因为特定的操作在空格键处理函数中混合在一起,这使得维护变得困难。

处理一个键的多个事件的最佳方法是什么,以便这些事件仅在某些情况下触发?


函数是 JavaScript 中的一流对象,这使得它们非常强大。正因为如此,你的问题才能得到非常优雅的解决。

// the whole thing can be encapsulated 
// into an object actually

function spaceBarHandler() {
  var state = spaceBarHandler.state;
  var actions = spaceBarHandler.actions;

    // execute function if exists
    if (actions[state]) {
      actions[state]();
    }
}

// spaceBar actions
spaceBarHandler.actions = {
  shoot: function() {
    // bang bang
  },
  removeBox: function() {
    // do it...
  }
};

// change current state from outside
// we are in the game
spaceBarHandler.state = "shoot";

// change current state from outside
// confirmation box is shown 
spaceBarHandler.state = "removeBox";

所有这些情况都将由一个函数处理。如果您想扩展另一种情况,只需向 actions 对象添加另一个函数即可。请注意整个事物是如何封装到一个对象中的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Javascript 中处理多个按键事件的最佳方法是什么? 的相关文章

  • while 循环中 regex.exec() 赋值的更好解决方案

    这里有更好的解决方案吗 我尽量避免里面的作业while但仍然能够循环匹配并使用捕获的组 var match var CSS URL PATTERN url s s s s gm while match CSS URL PATTERN exe
  • 禁用小写字符下划线:g q p j y?

    有时您不希望下划线盲目地穿过带下划线的页面标题 有没有办法自动优雅地禁用强调对于某些小写字符 在这些情况下 最好不要在这些小写字母下划线 例如 g q p j y CSS h1 text decoration underline PAGE
  • 使用 Google Apps 脚本处理数组中输入元素中的多个文件

    我有一个表单 允许从下拉列表中选择一个项目并上传文件 项目的名称和 ID 保存在电子表格文档中 适用于一个文件 但我想上传多个文件 你能帮我修改一下脚本吗 HTML 部分如下所示 div class col md 4 col sm 6 di
  • 为什么这个 JavaScript 可以在 Safari 上运行,但不能在 Firefox 上运行?

    我有 HTML 文件 我在 Safari 上尝试了该代码 运行良好 但是当我在 Firefox 上尝试这个时 它不起作用 任何人都可以建议如何使其在 Firefox 上工作吗 单击撤消按钮时 我想从 jsp 文件中检索内容 当我在 mac
  • jQuery show() 和 hide() 的更流畅替代方案

    我有一个带有隐藏列的页面设置 使用 jQuery show 和 hide 函数将列滑入和滑出 然而 它有点 笨重 并且在显示 隐藏时看起来不太流畅 相比之下 我还有一个使用 jquery UI 手风琴的页面部分 当在这些部分之间切换时 过渡
  • Karma + JSPM + Typescript - 未找到“.ts.js”

    主要只是想让 Karma JSPM 在加载 ts 文件时发挥良好作用 但绝对没有运气 我看到一个讨论库 https github com Larchy karma jspm typescript coverage tree master一个
  • 异步 JS 加载到 head 中

    我需要将脚本异步加载到页面上 我正在使用createElement方法在头部动态插入脚本标签 发生的事情是首先加载页面源 完成后 头部中包含的所有元素都会并行加载 一旦全部加载完毕 我动态添加的脚本就会加载 这在逻辑上是有道理的 但我正在寻
  • React 功能组件:作为函数调用与作为组件调用

    假设我有一个功能组件 const Foo props gt div props name div 直接作为函数调用有什么区别 const fooParent gt div Foo name foo div 与将其称为组件相比 const f
  • Javascript for 循环跳过最后一个元素

    我有一个数组 根据某些条件从中删除某些元素 当我删除元素时 我会重新启动 for 循环 因为索引已刷新 var k for k 0 k lt this j data length k if condition true this j dat
  • JavaScript 检查时区名称是否有效

    有没有一种方法可以在不使用外部库的情况下检查 JavaScript 中的时区名称是否有效 当用户在文本字段中输入时区名称时 我想验证时区是否有效 我知道我们可以使用时刻时区库轻松做到这一点 但我不想使用任何额外的库 我正在寻找纯 JavaS
  • 包含括号的变量会导致问题[重复]

    这个问题在这里已经有答案了 简单的事情 当单击按钮并将其写入文本字段时 我读取选择框的值 选择框
  • 处理照片上传的最佳方式是什么?

    我正在为一个家庭成员的婚礼制作一个网站 他们要求的一个功能是一个照片部分 所有客人都可以在婚礼结束后前往并上传他们的照片 我说这是一个很棒的想法 然后我就去实现它 那么只有一个问题 物流 上传速度很慢 现代相机拍摄的照片很大 2 5 兆 我
  • 将base64图像转换为Node Js中的文件

    我是 Node Js 新手 我需要包含用户的个人资料图片 我从 IOS 应用程序收到 Base64 图像的请求 我需要将其存储在 images 文件夹中并将图像路径保存在 mongodb 数据库中 我使用了以下代码 var bitmap n
  • 角度距离计算

    我正在使用角度制作距离计算应用程序 Html
  • Javascript For 循环在 dom 元素上执行[重复]

    这个问题在这里已经有答案了 我有 javascript 代码来获取具有类名称的元素 并迭代从元素中删除该类 var elements document getElementsByClassName test console log Leng
  • 如何让 Grunt.js 和 Meteor.js 协同工作?

    我想在我的 Meteor 应用程序中使用简单的复制和串联 但是当 Meteor 在服务器和客户端上运行所有 javascript 文件时 我遇到了问题 而我不希望它们在任何地方运行 它要么只是配置文件 例如Gruntfile js或我想以某
  • CSS 或 Javascript - 如果背景图像未加载,则显示后备文本[重复]

    这个问题在这里已经有答案了 如果徽标图形文件未加载或丢失 如何显示文本而不是徽标 我有带有背景 PNG 图像的 div div class iHaveBgImage this text should be displayed if bg i
  • 带有延迟的 jQuery 切换类只能运行一次

    当涉及到 jQuery 匿名函数和延迟时 我显然错过了一些基本的东西 下面的代码每次页面加载只能运行一次 它将添加该类 然后在 1 秒后将其删除 如果我再次单击 它将添加该类 但在页面持续时间内永远不会删除该类 除非我重新加载页面 var
  • Chrome + 另一个进程:进程间通信比 HTTP/XHR 请求更快?

    我有一个进程 1 对视频流进行实时图像处理 我需要在 Chrome 中的 HTML 页面中渲染该视频 同一台计算机上的进程 2 在canvas or img or videoHTML5 元素 由于我有 1000x1000 像素 x 3 字节
  • 如何在输入时格式化 contenteditable div?

    我正在尝试编写一个函数 允许 contenteditable div 在用户输入 div 时执行一些自动格式化 到目前为止我只能让它在 IE 中运行 有人可以帮助我吗 function formatOnKeyUp if window get

随机推荐

  • TestFlight Live、QuincyKit 和 Crashlytics 之间的比较

    我将在 AppStore 上启动我的应用程序 我想跟踪崩溃情况并尽快修复它们 如果可能的话 最好还收集一些有关用户活动和其他有用信息的附加信息 为此 我寻找了一些崩溃报告工具 我发现的最有趣的工具是 试飞直播 https testfligh
  • 我的锚链接不会从页面顶部开始

    我不确定发生了什么 我有两个页脚 一个页脚是侧边栏 另一个页脚是页面底部的常规页脚 我底部页脚中的锚标记链接到我的 关于 页面 将我带到页面底部而不是从顶部开始 而侧边栏页脚中的锚标记将我带到页面中间 加载时 其他锚链接也会将我带到页面的中
  • Android 清单文件中的 android:immersive 属性是什么?

    我正在为 Google Glass 开发一个应用程序 但我的活动遇到了问题 当我有 7 到 10 秒没有与他们互动时 他们就结束了 屏幕关闭后 我轻敲玻璃再次唤醒它 我的活动就会消失 我就可以开机了ok glass屏幕 我进行了很多搜索 但
  • NgxMatDatetimePicker 不可分配给 MatDatepickerBase 类型

    今天我使用创建了一个新的 Angular 项目角度 11 0 0 然后我安装了 angular material components datetime picker这是我的 package json 文件中读取的内容的一部分 angula
  • 如何传递对象参数来获取 Web api 中的方法?

    如何将对象参数传递给 get 方法 我搜索了很多 例如如何将参数传递给asp net web api get方法 https stackoverflow com questions 45766147 how to pass paramete
  • Insert 语句中的记录数 (Oracle)

    我想报告 Oracle 插入语句中插入的记录数 我是从语句插入的 因此我可以运行两次选择并进行计数 但我宁愿将其全部保留在一个语句中 有办法吗 在 PL SQL 中执行 INSERTSQL ROWCOUNT给出插入的行数 在 C 中执行 I
  • 使用 Angular 材质按列过滤谓词表

    我想使用谓词过滤器按列过滤我的 mat table 结果 我已经使用了一个简单的过滤器 但它过滤了所有列中的所有数据 我搜索类似的主题 但我不知道如何使用它 我尝试对所有列重复我的代码 但不起作用 请参阅下面的代码
  • 如何在 iPhone 通讯录中搜索特定电话号码?

    我正在开发一个使用 bonjour 连接到另一部 iPhone 的应用程序 它的功能之一是当我连接到其他设备时 它会自动检查我是否有其他人的电话号码 所以我的问题是如何检查我的地址簿中其他设备提供的电话号码 这是从我的地址簿方法之一中提取的
  • 如何以编程方式获取 Linux 中设备/分区的 uuid?

    我对 Linux 编程非常陌生 我的问题是 有没有办法以编程方式读取 Linux 中设备或分区的 UUID 是否有用于用户空间应用程序的 C C API 我发现了一些命令sudo vol id uuid dev sda1 sudo blki
  • Windows Docker mongo 容器不适用于卷挂载

    我有以下 docker 命令 docker run v c data data db mongo 我从 docker mongo 收到以下错误响应 MongoDB starting pid 1 port 27017 dbpath data
  • iOS 谷歌地图更改默认标记拖动行为

    我正在研究 Google 地图 api 目前 当我们尝试拖动标记时 我们必须按住几秒钟 然后 mapView 上升几个点 然后我们才能拖动标记 我想改变这种行为 我可以覆盖minimumPressDuration of UILongPres
  • 无法捕获视图层内的蒙版

    因此 我使用以下代码将图像蒙版应用到 UIView 层 CALayer maskLayer CALayer layer UIImage maskImage self image image maskLayer contents id mas
  • 进行 Maven 构建时 Jackson 依赖版本被覆盖

    我有一个完美运行的项目 我能够成功构建和部署 昨天 作为开发的一部分 我必须在我的项目中为 Jackson jar 添加以下 Maven 依赖项 然后mvn clean install开始失败
  • 如果我们有 GIL,为什么我们还需要线程锁?

    我相信这是一个愚蠢的问题 但我仍然找不到它 其实最好分成两个问题 1 我是否正确 我们可以有很多线程 但由于 GIL 在某一时刻只有一个线程正在执行 2 如果是这样 为什么我们还需要锁 我们使用锁来避免两个线程尝试读 写某个共享对象的情况
  • Pandas 内部合并/连接返回所有行

    我试图根据两个数据帧中存在的列来合并两个数据帧 仅保留两个数据集的交集 期望的结果是 foo bar foobar x y z x j i x y z j i a 1 2 a 9 0 a 1 2 9 0 b 3 4 b 9 0 b 3 4
  • Android 语音识别服务在 <= Ice Cream Sandwich 上速度慢得多

    我有一个正在实现 RecognitionListener 的服务 如下所示 Android 语音识别作为 Android 4 1 和 4 2 上的服务 https stackoverflow com questions 14940657 a
  • 静音时的 CSCore 环回录音

    我在用着CSCore WasapiLoopbackCapture录制系统声音 但当系统没有声音时 根本不录音 例如 在播放音乐并录制音乐时 输出文件的持续时间小于曲目的持续时间 我希望它即使在系统中没有声音时也能继续录制 但我没有找到任何属
  • DisplayFormat 数据注释不起作用

    我的模型类中有以下数据注释 Required ErrorMessage Required DisplayFormat ApplyFormatInEditMode true DataFormatString 0 MM dd yyyy publ
  • Safari 中的 css 颜色渲染不同

    我正在尝试为我的网络应用程序选择颜色 但意识到与 Firefox 或 Chrome 相比 Safari 呈现样式表的方式存在巨大差异 屏幕截图中的红色应该是 ff3366 但 safari 似乎选择渲染 ff0036 我不知道为什么我找不到
  • 在 Javascript 中处理多个按键事件的最佳方法是什么?

    游戏中按空格键会进行角色射击 出现确认框时按空格键会使该框消失 高分形式按空格键会在输入框中添加一个空格 在此示例中 同一键有多个事件 但一次仅触发一个事件 是否有通用 或特定于Javascript 方法或编程方式将事件添加到某个键 以便它