J'essaie d'écrire un jeu de vidéo poker en Javascript comme un moyen d'en descendre les bases, et j'ai rencontré un problème où les gestionnaires d'événements click jQuery se déclenchent plusieurs fois.
Ils sont attachés aux boutons pour placer un pari, et cela fonctionne très bien pour placer un pari sur la première main pendant un jeu (tirer une seule fois); mais en pariant pour la seconde main, il déclenche l'événement de clic deux fois à chaque fois qu'un bouton de pari ou de pari est pressé (donc le montant correct est parié deux fois pour chaque pression). Dans l'ensemble, il suit ce modèle pour le nombre de fois que l'événement de clic est déclenché lorsque vous appuyez une fois sur un bouton de pari - où le ième terme de la séquence est pour le pari de la ième main depuis le début du jeu: 1, 2, 4 , 7, 11, 16, 22, 29, 37, 46, ce qui semble être n (n + 1) / 2 + 1 pour tout ce qui vaut - et je n'étais pas assez intelligent pour le comprendre, j'ai utilisé OEIS . :)
Voici la fonction avec les gestionnaires d'événements click qui agissent; j'espère que c'est facile à comprendre (faites le moi savoir si non, je veux aussi m'améliorer):
/** 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
}
});
}
S'il vous plaît laissez-moi savoir si vous avez des idées ou des suggestions, ou si la solution à mon problème est similaire à une solution à un autre problème ici (j'ai regardé de nombreux sujets de même titre et je n'ai pas eu de chance de trouver une solution qui pourrait fonctionner pour moi).
var amount = parseInt(this.id.replace(/[^\d]/g,''),10);
Et si vous comptez utiliser plusieurs fois la même propriété d'un élément , mettez-la en cache . La recherche coûte cher.