Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 运行两次创建单击事件的函数会导致单击事件在一次单击中发生两次_Javascript_Jquery_Events_Jquery Events - Fatal编程技术网

Javascript 运行两次创建单击事件的函数会导致单击事件在一次单击中发生两次

Javascript 运行两次创建单击事件的函数会导致单击事件在一次单击中发生两次,javascript,jquery,events,jquery-events,Javascript,Jquery,Events,Jquery Events,我正在开发一个游戏,但我在这里总结了它的功能 TestA()用于在特定对象上创建单击事件。单击该对象时,它会更新数组tester 单击事件不应该总是存在,这就是为什么我使用TestA()创建它,然后在TestA()中关闭它 但是,当我背靠背运行两个TestA()函数时,数组会在一次单击时更新两次,而不是一次的预期行为,然后我需要再次单击以进行第二次更新 我正在尝试测试: var tester = [] function TestA() { $("someobject&quo

我正在开发一个游戏,但我在这里总结了它的功能

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

单击事件不应该总是存在,这就是为什么我使用
TestA()
创建它,然后在
TestA()
中关闭它

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

我正在尝试测试:

var tester = []

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

TestA()
---->单击一次后,单独运行此命令会使测试仪=[“hello”]

TestA()
TestA()
------->在一次点击测试仪后,背靠背运行这两个测试仪将变成
[“hello”,“hello]

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

同样,我的目标是让
TestA()
添加click事件,让它在单击时工作一次,直到第二个
TestA()
再次将事件输出


-我认为一种解决方法是让事件监听器到处都有,其函数中有一个“如果”,检查函数是否可以在单击时进行评估,但我更愿意只在小时间窗口中创建单击事件。

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

var tester = []

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

TestA()
下面是JSFIDLE中的一个小示例

<强>请注意<强>:为了实现某种欺骗保护,你应该考虑你的游戏逻辑的服务器端验证。JavaScript可以很容易地被用户操纵。这里是关于这个主题的一个链接:使用jQuery <代码>:< /p> 您可能可以实现您想要的:关联事件将仅触发一次:

const arr=[];
功能点击关闭(标志){
设b=$(“按钮”)。关闭(“单击”);
如果(标记)b.one(“点击”,ev=>{
arr.push(“点击”);
$(“#开关”).prop(“选中”,假);
控制台日志(arr)
});
}
$(“#开关”)。单击(函数(){clickOnOff(this.checked)});
//即使多次激活也会导致一次单击响应:
clickOnOff(1);clickOnOff(1);

倾听……

单击
谢谢!我单击了,当它将“hello”推到tester时,单击就不再注册了。也许我没有正确描述它-我要寻找的是,testA()的每次运行都是它自己的click函数的离散应用程序,所以我单击一次,[“hello”]就会显示出来。然后我再次单击,[“hello”,“hello”]我还计划开发服务器端工具,所以可能我要求的是不可能的,我只是希望测试迭代这个函数,看看它是否能工作,尽管我认为它甚至不会在实际游戏中使用。不客气。我只是删除了这一行
$(this)。关闭(“单击”)来自click handler的
。这就成功了,我也更新了JSFIDLE链接。所以现在请检查它是否满足您的要求。让我知道。我还使用了前面提到的
函数@cars10m。我认为这是一种比使用
$(this)更好的方法。关闭(“单击”)
在点击处理程序中。归功于他。请再次检查JSFIDLE链接。我不想窃取这个想法,但我想最重要的是一个有效且好的解决方案。JSFIDLE现在包含另一个元素,它调用
testA()
单击函数并向
单击我
元素添加一个新的一次性单击事件。
TestA()
添加一个事件处理程序。调用它两次会添加两个事件处理程序。第二个事件处理程序不会取代第一个事件处理程序,即使它们完全相同。它们在触发事件之前不会实际执行,因此
.off()
功能不能阻止2(或更多!)处理程序。在这种情况下,当您单击时,任何和所有附加的事件处理程序都将激发-2。正如您所说,它们同时运行,因此您可以获得看到的结果。与添加和删除事件处理程序不同,另一个选项可能是跟踪状态。最初设置所有处理程序,并在它们激发测试电流时进行设置nt状态,看看他们是否应该做些什么。作为一个简单的例子,
TestA()
不包括添加事件处理程序(将在页面加载或游戏开始时添加)或删除它,而只是测试
tester
是否为空。