运行一个创建两次点击事件的函数导致一次点击发生两次点击事件

Running a function that creates a click event twice causes the click event to happen twice with one click

我正在开发一款游戏,但我在这里总结了功能。

TestA() 用于在某个对象上创建点击事件。单击该对象时,它会更新数组 tester。

点击事件不应该总是存在,这就是为什么我用 TestA() 创建它,然后在 TestA().

中关闭它

然而,当我 运行 两个 TestA() 函数背靠背时,数组一次点击更新两次,而不是一次的预期行为,然后我需要再次点击第二次更新。

我正在尝试测试:

var tester = []

function TestA() {   
  $("someobject").click(function () {
    tester.push("hello")
    $(this).off()
  })
}

TestA()

----> 运行单击一次后,它本身就会 tester = ["hello"]

TestA()
TestA()

--------> 运行这两个背靠背,ONE click tester 之后变成 ["hello","hello]

我知道 Javascript 会同时评估所有内容(我过去发过类似的问题),但我确实需要确保人们不能在这个游戏中作弊!

同样,我的目标是 TestA() 添加点击事件,让它在点击时起作用,直到第二次 TestA() 再次发出该事件。

-我想一个解决方法是让事件侦听器随处可见,其函数内部有一个“if”来检查函数是否可以在单击时进行评估——但我宁愿只创建点击事件的时间 windows。

这应该可以解决您的问题:

var tester = []

function TestA() {
  // First remove click handler and set a new one
  $("someobject").off("click").one("click", function () {
    tester.push("hello")
  })
}

TestA()

这是jsfiddle中的一个小例子https://jsfiddle.net/yusmneb1/

请注意:要实现某种作弊保护,您应该考虑对游戏逻辑进行服务器端验证。 Javascript 可以很容易地被用户操纵。这是关于该主题的问题的link:How to prevent html/JavaScript code modification

通过使用jQuery .one()你大概可以达到你想要的效果:关联的事件只会被触发一次:

const arr=[];
function clickOnOff(flag){
  let b=$("button").off("click");
  if(flag) b.one("click",ev=>{
   arr.push("click");
   $("#switch").prop("checked",false);
   console.log(arr)
  });
}
$("#switch").click(function(){clickOnOff(this.checked)});
// even multiple activation will result in a SINGLE click response:
clickOnOff(1);clickOnOff(1);
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<label><input type="checkbox" id="switch" checked /> listening ...</label><br>
<button>click</button>