我目前正在使用jQuery在JS中编写程序,这基本上是一个跳棋游戏。
我正在使用jQuery的.on()
和.off()
函数为每个部分创建事件。会发生的是程序将循环遍历每个部分,并将设置在单击该部分时调用的函数。然后,此功能将向玩家显示该作品可以进行的移动。
这是使用for循环和此代码设置的:
$("#" + String(playerPositions[i])).on('click', function() {movePiece(validMoves, this)});
这会将该片段的有效移动以及该片段的ID传递给movePiece
函数,然后该函数会突出显示移动。
问题在于我的清理"函数,我想在移动后从所有部分中删除onClick处理程序。我使用这段代码:
var elements = $('.' + classToClean);
//clean off the onclick
elements.off("click"); <-- this doesn't work
//clean off the classes
elements.removeClass(classToClean);
奇怪的是a).removeClass
函数完美运行,b)onClick属性只从我刚刚移动的部分中删除。
我尝试过将一个空函数附加到该块上,但这不起作用。我也不能使用$('.validPieces').on('click', function () ... )
,因为我需要传递每件作品独有的变量。
提前感谢您的帮助,我为文字墙道歉,但我想确保一切都清楚。
答案 0 :(得分:2)
使用# === remove extra question mark ===
RewriteCond %{QUERY_STRING} ^(.*)%3F$ [NC]
RewriteRule .* %{REQUEST_URI}?%1 [R,L]
应删除该类型的所有事件处理程序。如果这不起作用,那么您要删除的元素可能与它们所附加的元素不匹配。
如果删除的内容超出了您的要求,则需要在.off('click')
调用中包含对处理程序的引用。要为每个调用保留不同的.off()
变量,您需要使用闭包:
validMoves
请注意,您需要保留对移动功能的引用,或者在调用function move(validMoves) {
return function() {
movePiece(validMoves, this);
}
}
// within your for loop
keepMoveFn[i] = move(validMoves);
$("#" + String(playerPositions[i])).on('click', keepMoveFn[i] );
// elsewhere in your code:
//clean off the onclicks
keepMoveFn.forEach(function(fn) {
el.off("click", fn );
}
功能时可以访问它。在上面的代码片段中,我假设您保留了一系列函数,然后您可以稍后迭代以删除单击事件。