Estoy tratando de escribir un juego de video póker en Javascript como una forma de obtener los conceptos básicos, y me he encontrado con un problema en el que los controladores de eventos jQuery click se disparan varias veces.
Están unidos a botones para hacer una apuesta, y funciona bien para hacer una apuesta en la primera mano durante un juego (disparando solo una vez); pero al apostar por la segunda mano, dispara el evento de clic dos veces cada vez que se presiona un botón de apuesta o apuesta de lugar (por lo que se apuesta dos veces la cantidad correcta por cada presión). En general, sigue este patrón por la cantidad de veces que se dispara el evento de clic cuando se presiona un botón de apuesta una vez, donde el i-ésimo término de la secuencia es para apostar la i-ésima mano desde el comienzo del juego: 1, 2, 4 , 7, 11, 16, 22, 29, 37, 46, que parece ser n (n + 1) / 2 + 1 para lo que sea que valga la pena, y no era lo suficientemente inteligente como para entender eso, usé OEIS . :)
Aquí está la función con los controladores de eventos de clic que están actuando; espero que sea fácil de entender (avíseme si no, también quiero mejorar en eso):
/** 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
}
});
}
Avíseme si tiene alguna idea o sugerencia, o si la solución a mi problema es similar a una solución a otro problema aquí (he examinado muchos hilos con títulos similares y no tuve suerte en encontrar una solución que pudiera funcionar para mi).
var amount = parseInt(this.id.replace(/[^\d]/g,''),10);
Y si va a usar la misma propiedad de un elemento más de una vez, almacene esa propiedad, no siga buscando. La búsqueda es costosa.