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

老虎机游戏文本闪烁缓动速度及二次点击异常求助

嘿,我来帮你一步步拆解问题,解决你的困惑:

核心问题:第二次点击数值直接变为0的原因

你遇到的问题出在time变量的作用域上——它是在document ready的全局作用域里定义的,第一次点击按钮后,time会持续累加计算到最终的最大值,第二次点击时并没有被重置回初始值0。同时循环的i从0开始,通过easeInOutExpo计算出来的时间会直接跳回到起始的低数值,导致看起来数值直接从50变成了0。

修复方案:每次点击按钮时,先把time重置为初始值:

$("#clickme").click(function() {
  time = 0; // 重置time到初始状态
  for (var i = 0, len = diff; i <= len; i++) {
    (function(s) {
      setTimeout(function() {
        $('#book').html("Page " + s + " turned");
      }, time);
    })(i);
    time = easeInOutExpo(i, minTime, maxTime, diff);
  }
});
关于你疑惑的自执行函数作用

你标记的这段(function(s) { ... })(i)是立即执行函数表达式(IIFE),核心作用是在循环中「捕获当前的i值」。

因为setTimeout是异步执行的,当整个循环跑完后,所有的setTimeout回调才会依次触发。如果不用IIFE,所有回调里的i都会指向循环结束后的最终值(也就是diff + 1),导致所有回调都显示同一个数值。通过把i作为参数传入IIFE,我们把当前循环步骤的i值保存到了IIFE的局部变量s中,这样每个setTimeout都能拿到对应循环步骤的正确数值。

移动端适配的老虎机实现建议

针对移动端的老虎机开发,给你几个更优的方向:

  • 优先用CSS动画+JS控制:CSS的@keyframes和transition支持硬件加速,在移动端的性能比jQuery动画更好。你可以用animation-timing-function模拟你需要的easeInOutExpo缓动效果(比如用cubic-bezier(0.19, 1, 0.22, 1)近似),通过JS添加/移除CSS类来触发老虎机滚轮的旋转动画。
  • 替换递归闪烁为requestAnimationFrame:如果坚持用jQuery,尽量用requestAnimationFrame代替setTimeout/setInterval,它会和浏览器的刷新频率同步,减少移动端的卡顿问题。
  • 保留服务器端防作弊逻辑:你最初的思路非常正确——服务器生成随机结果数组传给前端,前端只负责按照数组顺序播放动画,最终停在服务器指定的结果上。这种逻辑完全适配移动端,只需要确保接口请求的稳定性(比如处理网络异常、加载状态)。

内容的提问来源于stack exchange,提问作者power-of-ra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:44:37