Sto tentando di scrivere un gioco di video poker in Javascript come un modo per metterlo a tacere, e ho riscontrato un problema in cui i gestori di eventi jQuery Click si attivano più volte.
Sono collegati ai pulsanti per piazzare una scommessa, e funziona benissimo per piazzare una scommessa sulla prima mano durante una partita (sparando una sola volta); ma scommettendo per la seconda mano, genera l'evento click due volte ogni volta che viene premuto un pulsante di scommessa o piazza scommessa (quindi due volte l'importo corretto viene puntato per ogni pressione). Complessivamente, segue questo schema per il numero di volte in cui l'evento click viene lanciato quando si preme una volta il pulsante di scommessa - dove l' ennesimo termine della sequenza è per la scommessa dell'ennesima mano dall'inizio del gioco: 1, 2, 4 , 7, 11, 16, 22, 29, 37, 46, che sembra essere n (n + 1) / 2 + 1 per quello che vale - e non ero abbastanza intelligente per capirlo, ho usato OEIS . :)
Ecco la funzione con i gestori di eventi click che agiscono; speriamo che sia facile da capire (fammi sapere se no, voglio migliorare anche in questo):
/** 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
}
});
}
Per favore fatemi sapere se avete idee o suggerimenti o se la soluzione al mio problema è simile a una soluzione a un altro problema qui (ho esaminato molti thread con lo stesso titolo e non ho avuto fortuna nel trovare una soluzione che potesse funzionare per me).
var amount = parseInt(this.id.replace(/[^\d]/g,''),10);
E se hai intenzione di utilizzare la stessa proprietà di un elemento più di una volta memorizza nella cache quella proprietà, non continuare a cercarla. La ricerca è costosa.