Jquery remove class并没有真正删除它

时间:2014-03-08 07:19:28

标签: javascript jquery class

var newLevel = function(level){
setTimeout(function(){
var time=2;
for(var i=1;i<level+1;i++){
    var box = parseInt(Math.random()*25+1)
    if($("#box"+box).hasClass("g3")){
        i--
    }else{
    $("#box"+box).removeClass();
    $("#box"+box).addClass("g3");
    }
}
setTimeout(function(){
        $(".g3").addClass("g2");
        $(".g3").removeClass("g3");
        var right = 0;
        var toGet = level
        $(".g2").click(function(){
            $(this).removeClass("g2");
            $(this).addClass("g3");
            right++
            if(right==toGet){
                level++;
                gameBoard(level)
                newLevel(level);
            }
        })
    },time*1000);
},2800);

}   

所以我像往常一样制作游戏,但我一如既往地遇到了问题。我认为正在发生的error来自"click" event .g2 clickedvisibly移除.g2 classth } .g3 class变为visible。但在此event之后re-click你可div .g2 {之前visibly .g3 right++ .g2并且会产生同样的影响( {{1}})所以似乎{{1}}并未真正被移除?无论如何,我会喜欢一些帮助,欢呼。

2 个答案:

答案 0 :(得分:2)

查询jQuery的点击功能不是直播,一旦附加了事件处理程序,如果DOM元素发生变化,它就不会被删除(在你的情况下你的情况下)删除类)。想象一下,使用类为N个元素注册一个单击处理程序,然后从其中一半中删除该类。所有这些都将处理该事件,因为已附加了单击处理程序。

您应该使用one()功能代替click()

$(".g2").one("click", (function() {

它的工作原理是你注册了一个点击处理程序,然后删除了一个类(你不再需要点击处理程序)。这就是one()所做的事情,事件处理程序只执行一次(所以你不需要任何实时查询)。

答案 1 :(得分:0)

我认为具有类g2的元素将始终具有此onclick,即使在删除该类之后也是如此。这是预料之中的。一种解决方法是在运行代码之前首先检查“this”是否具有类g2:

$(".g2").click(function(){
            var $this = $(this);
            if($this.hasClass("g2")){
                $this.removeClass("g2");
                $this.addClass("g3");
                right++
                if(right==toGet){
                    level++;
                    gameBoard(level)
                    newLevel(level);
                }
            }
        })

但如果g2级别从未重新添加,那么Adriano的答案会更好:)