Javascript 在jQuery中禁用事件处理程序

Javascript 在jQuery中禁用事件处理程序,javascript,jquery,event-handling,Javascript,Jquery,Event Handling,我正在创建一个简单的tic-tac-toe游戏,我有一个触发代码中许多函数的事件处理程序。问题是,当游戏结束时,我想禁用该事件处理程序,这样游戏就可以结束,用户就不能与之交互。我已经研究过了,解除绑定/绑定、开/关/道具/属性置零不起作用。当满足条件时,是否有其他方法禁用此事件处理程序?我想禁用.one('click')处理程序,而不是开始的父处理程序 //Creates the variables needed to be manipulated later $(document).ready

我正在创建一个简单的tic-tac-toe游戏,我有一个触发代码中许多函数的事件处理程序。问题是,当游戏结束时,我想禁用该事件处理程序,这样游戏就可以结束,用户就不能与之交互。我已经研究过了,解除绑定/绑定、开/关/道具/属性置零不起作用。当满足条件时,是否有其他方法禁用此事件处理程序?我想禁用.one('click')处理程序,而不是开始的父处理程序

//Creates the variables needed to be manipulated later
$(document).ready(function () {
    var X = 'X';
    var O = 'O';
    var currentPlayer;
    var turnCount = 0;
    var xMoves = [];
    var oMoves = [];
    var cellTracker;
    var winAlert;
    var winConditions = [
        ['c1', 'c2', 'c3'],
        ['c4', 'c5', 'c6'],
        ['c7', 'c8', 'c9'],
        ['c1', 'c4', 'c7'],
        ['c2', 'c5', 'c8'],
        ['c3', 'c6', 'c9'],
        ['c1', 'c5', 'c9'],
        ['c3', 'c5', 'c7']
    ];

    /*Set's the current player to X if turnCount is odd
    And to O if turnCount is even*/
    var setCurrentPlayer = function () {
        if (turnCount % 2 === 0) {
            currentPlayer = O;
        } else {
            currentPlayer = X;
        }
    };

    //Pushes cellTracker's value to the curent player's move variable
    var storeMoves = function () {
        if (currentPlayer === X) {
            xMoves.push(cellTracker);
        } else if (currentPlayer === O) {
            oMoves.push(cellTracker);
        }
    };

    //Compares players moves with the winConditions to determine a winner
    var determineWin = function (pMoves) {
        for (var i = 0; i < winConditions.length; i++) {
            if (winConditions[i].length > pMoves.length) {
                continue;
            }
            for (var j = 0; j < winConditions[i].length; j++) {
                winAlert = false;
                for (var k = 0; k < pMoves.length; k++) {
                    if (pMoves[k] === winConditions[i][j]) {
                        winAlert = true;
                        break;
                    }

                }
                if (!winAlert) break;
            }
             if (winAlert) {
                alert(currentPlayer + " wins!");
                break;
            }
        }
    };

    /*Place's an X or an O when a cell is clicked depending
    on the current player, and updates the turnCount*/
    $('td').one('click', function () {
        turnCount += 1;
        setCurrentPlayer();
        $(this).text(currentPlayer);
        cellTracker = $(this).attr('id');
        storeMoves();
        determineWin(currentPlayer == 'X' ? xMoves : oMoves);
        if (turnCount === 9 && winAlert === false) {
            alert("Tie game!");
        }
        console.log(turnCount, xMoves, oMoves, winAlert);
    });
});
//创建以后需要操作的变量
$(文档).ready(函数(){
变量X='X';
变量O='O';
var-currentPlayer;
var turnCount=0;
var xMoves=[];
var-oMoves=[];
细胞跟踪器;
var-winAlert;
var winConditions=[
['c1','c2','c3'],
['c4','c5','c6'],
[c7',c8',c9'],
['c1','c4','c7'],
['c2','c5','c8'],
['c3','c6','c9'],
['c1','c5','c9'],
['c3','c5','c7']
];
/*如果turnCount为奇数,则将当前玩家设置为X
如果turnCount为偶数,则为O*/
var setCurrentPlayer=函数(){
如果(营业额%2==0){
currentPlayer=O;
}否则{
currentPlayer=X;
}
};
//将cellTracker的值推送到当前玩家的移动变量
var storeMoves=函数(){
如果(currentPlayer==X){
xMoves.push(cellTracker);
}else if(currentPlayer==O){
oMoves.push(细胞跟踪器);
}
};
//将玩家的移动与winConditions进行比较,以确定胜利者
var determineWin=函数(pMoves){
对于(变量i=0;ipMoves.length){
继续;
}
对于(var j=0;j
您是否尝试禁用发生单击事件的元素?例如,如果要禁用单击
td
元素,可以使用:

$('td').prop("disabled",true);
当您想重新启用时,只需使用:

$('td').prop("disabled",false);

为prop或attr方法设置空值没有帮助。使用上述方法。希望有帮助

尝试将其定义为函数:

var handler = function () {
        turnCount += 1;
        setCurrentPlayer();
        $(this).text(currentPlayer);
        cellTracker = $(this).attr('id');
        storeMoves();
        determineWin(currentPlayer == 'X' ? xMoves : oMoves);
        if (turnCount === 9 && winAlert === false) {
            alert("Tie game!");
        }
        console.log(turnCount, xMoves, oMoves, winAlert);
    });
然后附上:

$('td').one('click', handler);
无论何时,只要您想将其删除,就可以:

$('td').off('click', handler);
编辑:在删除处理程序变量之前,需要定义它,但这应该是合理的。只需在顶部定义它,并在调用
one
之前进行设置,它就可以用于代码的任何其他部分

编辑:看了看你的小提琴。有关有效解决方案,请参阅。就像我前面说的,
$.off
总是有效的:你的用法是错误的。要执行您想要的操作,您必须在检测到要结束游戏时调用
$.off
调用,而不是在底部编写代码,并期望在您更改变量值的任何时候都能神奇地调用它。如果您想要这种行为,请查看Knockout或AngularJS。

使用.off()和事件名称间隔

$('td').one('click.mygame', function () {
    turnCount += 1;
    setCurrentPlayer();
    $(this).text(currentPlayer);
    cellTracker = $(this).attr('id');
    storeMoves();
    determineWin(currentPlayer == 'X' ? xMoves : oMoves);
    if (turnCount === 9 && winAlert === false) {
        alert("Tie game!");
    }

    if(condition){ //like ( winAlert === true  || turnCount === 9)
        $('td').off('click.mygame')
    }

    console.log(turnCount, xMoves, oMoves, winAlert);
});

演示:

它们如何“不起作用”?@DavidThomas用户仍然可以单击元素,代码仍在运行。您必须使用“Inspect element”[Chrome和Firefox内部的工具]或FIREBUG进行错误分析。@MirkoCianfarani我有,没有任何日志记录,没有错误,它根本没有按照我的要求进行分析。这也不起作用,但这有助于解决另一个问题。我甚至不知道你能做到这一点。谢谢大家!
jQuery.off
总是有效的:如果它对您不起作用,那么您可能没有正确定义事物,或者没有实际运行您认为应该关闭事件绑定的代码。显示您尝试的全部代码,包括应该关闭但没有关闭的代码。抱歉,我正在做一些修订并测试其他代码。这里是最新结果的摆弄。那么,就这些吗?没人能回答这个问题吗?@user2449973你之前也问过类似的问题,对吧,你能分享小提琴吗?我从来没有问过关于事件处理程序的问题,你指的是什么问题?@user2449973关于游戏与数组相关的东西这是我在问多维数组时发布的小提琴,这就是决定我获胜条件的因素。@user2449973那么你能把这个问题重新处理一下吗