【发布时间】:2021-01-24 16:43:10
【问题描述】:
我正在开发一款游戏,但我在这里简化了功能。
TestA() 旨在在某个对象上创建点击事件。单击该对象时,它会更新一个数组 tester。
点击事件不应该一直存在,这就是为什么我使用TestA() 创建它,然后在TestA() 中将其关闭。
但是,当我背靠背运行两个 TestA() 函数时,数组会在一次单击时更新两次,而不是预期的一次,然后我需要再次单击以进行第二次更新。
我正在尝试测试:
var tester = []
function TestA() {
$("someobject").click(function () {
tester.push("hello")
$(this).off()
})
}
TestA()
----> 单独运行一次,一键生成tester = ["hello"]。
TestA()
TestA()
------->这两个背靠背运行,一键测试后变成["hello","hello]
我知道 Javascript 会同时评估所有内容(我过去曾发布过类似的问题),但我确实需要确保人们不能在这个游戏中作弊!
同样,我的目标是让TestA() 添加点击事件,让它在点击时工作一次,直到第二个TestA() 再次发出事件。
-我想一种解决方法是让事件侦听器在其函数内部使用“if”来检查是否甚至可以在单击时评估该函数-但我宁愿只创建单击小时间窗口中的事件。
【问题讨论】:
-
TestA()添加事件处理程序。调用它两次会添加 2 个事件处理程序。第二个不会取代第一个,它们会叠加,即使它们是相同的。在触发事件之前,它们实际上不会执行,因此.off()功能不会阻止创建 2 个(或更多!)处理程序。当您单击时,任何和所有附加的事件处理程序都将触发 - 在这种情况下为 2。正如您所说,它们同时运行,因此您会得到您所看到的结果。 -
除了添加和删除事件处理程序之外,另一种选择可能是跟踪状态。最初设置所有处理程序,并在它们触发时测试当前状态以查看它们是否应该做任何事情。举个简单的例子,
TestA()不包括添加事件处理程序(将在页面加载、游戏开始或其他任何情况下添加)或删除它,而只是测试tester是否为空。
标签: javascript jquery events jquery-events