javascript - 如何在没有全局变量的情况下从html中的不同事件调用类方法
问题描述
我在 JS 中有一个游戏,它从 body onload 开始,然后使用在 body onmousemove 事件上更新的光标位置。
首先,我的 JS 文件中有全局变量和单独的函数,我这样称呼它们:
<body onload="startGame()" onmousemove="setMousePosition(event)">
它工作得很好,但我想摆脱全局变量。我已将所有内容都包含在 Game 类中,但现在我不知道如何从不同的 html 事件中调用类方法。我能想到的唯一解决方案是全局声明游戏对象,但我仍然必须使用全局变量(这比一大堆更好,但仍然......):
HTML:
<body onload="game = new Game()" onmousemove="game.setMousePosition(event)">
JS:
class Game {
constructor() {
// do the thing
}
setMousePosition(e) {
// do the thing
}
}
let game;
是否有任何优雅的方法可以在没有全局变量的情况下从不同的 html 事件调用类方法?
解决方案
通过 HTML 属性添加事件侦听器实际上是一种古老且不推荐的方法,这正是您遇到的原因:您需要全局变量。现代方法是不使用 HTML 来处理事件,而是使用 JavaScript 首先查找您想要的元素,然后使用函数向其添加事件侦听器addEventListener
。因此,在您的情况下,您的游戏初始化代码中将包含如下代码。
document.body.addEventListener('mousemove', setMousePosition);
推荐阅读
- woocommerce - 如何通过多维数组以编程方式创建多达 3-5 个变体的 woocommerce 变体
- postgresql - 有没有办法在聚合调用中不使用 ORDER BY 对 postgresql 自定义聚合中的行进行预排序?
- r - 如何在 R 中进行循环计算?
- python - 处理 WSGI 脚本 Flask Apche2 EC2 发生异常
- javascript - 使用moment和lodash按月和周进行数据聚合 - Javascript
- r - 如何计算出用于负二项式 GLM 的数据的 theta 值?
- pytorch - 如何将自定义 PyTorch 模型 (model.pt) 转换为 Huggingface Transformers 模型,以便使用 from_pretrained() 加载它?
- django - AttributeError:'list' 对象没有属性'split' Django Haystack Solr
- javascript - 在reduce中将空数组设置为空数组中的初始值
- flutter - Flutter hivebox HiveError: Box has already been closed