You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发Simon游戏遇异常:按钮需点击两次才触发addClass动画效果

Simon游戏点击动画需两次触发的问题修复

问题根源在于你的animatePress函数逻辑错误:每次点击按钮时调用它,它并没有直接执行动画,而是给对应颜色的按钮新增了一个click事件监听。第一次点击.btn时,只是完成了事件绑定,没触发动画;第二次点击时,才会触发刚绑定的事件执行动画,所以才需要点两次。

修正方案

把animatePress改成直接执行动画的函数,去掉内部的on("click")绑定——外层已经有.btn的点击事件,拿到点击的颜色后直接调用函数执行动画即可:

var buttonColours = ["red", "blue", "green", "yellow"];
var gamePattern = [];
var userClickedPattern = [];

function playSound(name) {
    var audio = new Audio("./sounds/" + name + ".mp3");
    audio.play();
}

function nextSequence() {
    var randomNumber = Math.floor(Math.random() * 4);
    var randomChosenColour = buttonColours[randomNumber];
    gamePattern.push(randomChosenColour);
    $("#" + randomChosenColour).fadeOut(100).fadeIn(100);
    playSound(randomChosenColour);
}

// 修正后:直接执行动画逻辑,不再绑定事件
function animatePress(currentColour) {
    $("#" + currentColour).addClass("pressed");
    setTimeout(function () {
        $("#" + currentColour).removeClass("pressed");
    }, 100);
}

$(".btn").on("click", function () {
    var userChosenColour = this.id;
    userClickedPattern.push(userChosenColour);
    playSound(userChosenColour);
    animatePress(userChosenColour);
})

更简洁的写法

其实可以直接在.btn的点击回调里写动画逻辑,不用单独抽函数,还能避免重复选择DOM元素:

$(".btn").on("click", function () {
    var userChosenColour = this.id;
    userClickedPattern.push(userChosenColour);
    playSound(userChosenColour);
    // 直接操作当前点击的按钮
    $(this).addClass("pressed");
    setTimeout(() => $(this).removeClass("pressed"), 100);
})

内容的提问来源于stack exchange,提问作者Gustavo F. Marcial

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 09:42:45