我正在尝试用Javascript编写一个视频扑克游戏,以此来掌握其基础知识,但我遇到了一个问题:jQuery点击事件处理程序会多次触发。它们附加在下注按钮上,在第一局游戏中下注时可以正常工作(仅触发一次);但是在下注第二手牌时,每次按下下注或放置下注按钮都会触发两次点击事件(因此每次按下将下注两倍的正确金额)。总体而言,当只按下一次下注按钮时,它遵循以下模式触发点击事件的次数,其中序列的第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
}
});
}
请告诉我您是否有任何想法或建议,或者如果解决我的问题的方法类似于此处另一个问题的解决方法(我查看了许多标题类似的线程,但没有找到适合我的解决方案)。
var amount = parseInt(this.id.replace(/[^\d]/g,''),10);
如果您将要多次使用元素的同一属性,请缓存该属性,不要一直重新查找。这种查找是很昂贵的。 - David Thomas