jQuery单击事件多次触发

新手上路,请多包涵

我正在尝试用 Javascript 编写一个视频扑克游戏,以此来了解它的基础知识,但我遇到了一个问题,即 jQuery click 事件处理程序多次触发。

它们附在用于下注的按钮上,并且在游戏期间第一手下注时效果很好(仅触发一次);但是在下注秒手时,每次按下下注或下注按钮时,它都会触发两次点击事件(因此每次按下正确的金额都会下注两次)。总的来说,当按下一个下注按钮时,点击事件被触发的次数遵循这种模式——序列的 第 i 项是从游戏开始的 第 i 手下注:1、2、4 , 7, 11, 16, 22, 29, 37, 46,这似乎是 n(n+1)/2 + 1 对于任何值 - 我不够聪明,无法弄清楚,我使用了 OEIS . :)

这是带有正在执行的单击事件处理程序的函数;希望它很容易理解(如果没有,请告诉我,我也想在这方面做得更好):

/** The following function keeps track of bet buttons that are pressed, until place button is pressed to place bet. **/
function pushingBetButtons() {
    $("#money").text("Money left: $" + player.money); // displays money player has left

    $(".bet").click(function() {
        var amount = 0; // holds the amount of money the player bet on this click
        if($(this).attr("id") == "bet1") { // the player just bet $1
            amount = 1;
        } else if($(this).attr("id") == "bet5") { // etc.
            amount = 5;
        } else if($(this).attr("id") == "bet25") {
            amount = 25;
        } else if($(this).attr("id") == "bet100") {
            amount = 100;
        } else if($(this).attr("id") == "bet500") {
            amount = 500;
        } else if($(this).attr("id") == "bet1000") {
            amount = 1000;
        }
        if(player.money >= amount) { // check whether the player has this much to bet
            player.bet += amount; // add what was just bet by clicking that button to the total bet on this hand
            player.money -= amount; // and, of course, subtract it from player's current pot
            $("#money").text("Money left: $" + player.money); // then redisplay what the player has left
        } else {
            alert("You don't have $" + amount + " to bet.");
        }
    });

    $("#place").click(function() {
        if(player.bet == 0) { // player didn't bet anything on this hand
            alert("Please place a bet first.");
        } else {
            $("#card_para").css("display", "block"); // now show the cards
            $(".card").bind("click", cardClicked); // and set up the event handler for the cards
            $("#bet_buttons_para").css("display", "none"); // hide the bet buttons and place bet button
            $("#redraw").css("display", "block"); // and reshow the button for redrawing the hand
            player.bet = 0; // reset the bet for betting on the next hand
            drawNewHand(); // draw the cards
        }
    });
}

如果您有任何想法或建议,或者我的问题的解决方案是否类似于此处的另一个问题的解决方案,请告诉我(我查看了许多类似标题的线程,但没有找到可行的解决方案为了我)。

原文由 Gregory Fowler 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

要确保一次单击操作,请使用以下命令:

 $(".bet").unbind().click(function() {
 //Stuff
 });

原文由 Rob 发布,翻译遵循 CC BY-SA 3.0 许可协议

.unbind() 已弃用,您应该改用 .off() 方法。只需在调用 .off() 之前调用 .on()

这将删除所有事件处理程序:

 $(element).off().on('click', function() {
    // function body
});

仅删除已注册的“点击”事件处理程序:

 $(element).off('click').on('click', function() {
    // function body
});

原文由 mtl 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题