Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.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 如何使用for循环删除多个事件侦听器?_Javascript_Jquery_Chess - Fatal编程技术网

Javascript 如何使用for循环删除多个事件侦听器?

Javascript 如何使用for循环删除多个事件侦听器?,javascript,jquery,chess,Javascript,Jquery,Chess,我正在创建一个国际象棋程序来测试我的javascript能力。它没有任何人工智能,只计算在任何给定时间可以执行哪些动作,允许玩家执行该动作,并改变回合数 下面是当前程序的JSFIDLE: 游戏机制如下: 1) firstEventListener将事件侦听器放置在有资格移动的所有片段上: divChessboardContainer.addEventListener("click", firstEventListener, true); 2) 用户单击一个符合条件的条目。如果需要,他们可以点击

我正在创建一个国际象棋程序来测试我的javascript能力。它没有任何人工智能,只计算在任何给定时间可以执行哪些动作,允许玩家执行该动作,并改变回合数

下面是当前程序的JSFIDLE:

游戏机制如下:

1) firstEventListener将事件侦听器放置在有资格移动的所有片段上:

divChessboardContainer.addEventListener("click", firstEventListener, true);
2) 用户单击一个符合条件的条目。如果需要,他们可以点击多个片段

3) 该程序从event.target(removeAddClassesReturnPieceData)收集数据,检查已选择的工件,并确定该工件可以执行哪些移动(ifWhitePawn、ifBlackKnight等),并以绿色突出显示建议的移动(generateObjectForSecondEventListener)

4) 每个以绿色突出显示的提议移动都有一个事件侦听器:

proposedPositionElement.addEventListener("click", movePieces.bind( null, objectForSecondEventListener, proposedPositionElement ), false);
5) 用户单击一个提议的移动并执行移动(movePieces)。目前,它只是交换所选工件和建议位置的IMG标签

6) 我遇到的问题是,我想从所有方块中删除第二个事件侦听器,这些方块在每一回合结束时都以绿色突出显示,但我似乎无法删除它。我研究过removeEventListener()方法,我知道语法必须非常具体才能正确工作,但我无法确定我做错了什么。我创建了一个for循环,试图删除事件侦听器(这不起作用):

for(设i=0;i

有人能帮我吗?

在步骤4中,将事件绑定到movePieces.bind(…),在步骤6中,尝试删除movePieces侦听器。这些是不同的功能。另外,尝试删除movePieces.bind(…)也不会起作用,因为这将创建第三个函数。您需要在步骤4中的某个位置存储绑定的函数引用,并在步骤5中检索它。

在步骤4中,您将事件绑定到movePieces.bind(…),在步骤6中,您尝试删除movePieces侦听器。这些是不同的功能。另外,尝试删除movePieces.bind(…)也不会起作用,因为这将创建第三个函数。您需要在步骤4中将绑定函数引用存储在某处,并在步骤5中检索它。

问题标记为“jQuery”。有什么理由不使用jQuery的
.on()
.off()
?两个月前开始学习JS,我对vanilla JS比jquery更熟悉。。。。但下次我会记住这一点。谢谢:)问题被标记为“jQuery”。有什么理由不使用jQuery的
.on()
.off()
?两个月前开始学习JS,我对vanilla JS比jquery更熟悉。。。。但下次我会记住这一点。谢谢:)谢谢您的回答,我听从了您的建议,效果很好:)将事件侦听器更改为:
proposedPositionElement.addEventListener(“单击”,movePieces,false)意识到我花了太多时间试图使用“movePieces.bind(…)”传递参数,以至于我忘了我可以在“movePieces”函数中使用“event.target”来获取事件数据,而根本不需要传递参数。我使用现有的“selectedPiece”类来获取所选工件的数据。建议使用
event.target
小心。我怀疑您可能依赖于
window.event
,这是Microsoft的优先事项,除了在IE/Edge中之外,它不会工作。这是
event.target
-->-->它具有完全的浏览器兼容性:)您测试过哪些浏览器?Chrome、Opera和Firefox。。。。Firefox中存在一个问题,它无法将
事件
识别为全局变量,因此在任何函数调用中都必须将其作为参数传递。但它确实有效。感谢您的回答,我遵循了您的建议,并且成功了:)将事件侦听器更改为:
proposedPositionElement.addEventListener(“单击”,movePieces,false)意识到我花了太多时间试图使用“movePieces.bind(…)”传递参数,以至于我忘了我可以在“movePieces”函数中使用“event.target”来获取事件数据,而根本不需要传递参数。我使用现有的“selectedPiece”类来获取所选工件的数据。建议使用
event.target
小心。我怀疑您可能依赖于
window.event
,这是Microsoft的优先事项,除了在IE/Edge中之外,它不会工作。这是
event.target
-->-->它具有完全的浏览器兼容性:)您测试过哪些浏览器?Chrome、Opera和Firefox。。。。Firefox中存在一个问题,它无法将
事件
识别为全局变量,因此在任何函数调用中都必须将其作为参数传递。但它确实有效。
for ( let i = 0; i < allListTags.length; i += 1 ) {

    let proposedPositionElement = allListTags[i];

    console.log(proposedPositionElement);

    proposedPositionElement.removeEventListener("click", movePieces, false);

}