JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)

我将详细讲解“JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)”,并给出两个示例说明。

JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)

前言

上一篇文章已经介绍了JavaScript实现跑马灯抽奖活动的基本思路和代码,在这篇文章中,我们将分析、优化并完善之前的代码。接下来我们将介绍具体的步骤。

代码优化

1. 变量申明

原来的代码中,所有的变量都是使用var声明的。但是var是在函数中申明变量的,会存在变量提升的问题。所以优化的第一步是使用let和const来代替var,确保变量只在需要使用的代码块内部定义。

2. 代码简化

原来的代码在每次转动时都需要重新计算距离,这样会增加代码的复杂度和运行时间。我们可以将转动距离提前进行预处理,避免重复计算。

同时,我们可以将一些重复代码进行封装,使代码更加简洁易读。

3. 细节优化

在实际使用中,用户可能会连续多次点击开始按钮,这样会导致每个跑马灯都在不停地旋转,造成资源浪费。我们可以添加一些判断措施,确保每次只有一个跑马灯在旋转。

完整代码

下面是优化后的完整代码:

const lottery = document.querySelector(".lottery");
const startBtn = document.querySelector(".start-btn");

startBtn.addEventListener("click", () => {
  if (lottery.classList.contains("active")) return; // 判断是否已经在旋转

  const prizes = ["电视", "手机", "平板电脑", "电饭煲"];
  const prizeIndex = Math.floor(Math.random() * prizes.length);
  const prize = prizes[prizeIndex];

  lottery.classList.add("active");

  let rotateCount = 0;
  const rotateUnit = 45; // 每次旋转的角度
  const rotateNum = 8; // 旋转次数
  const totalAngle = rotateNum * 360 + prizeIndex * rotateUnit; // 总的旋转角度

  for (let i = 0; i < 4; i++) {
    const list = lottery.querySelector(`.list-${i}`);
    list.style.transform = `rotate(${totalAngle}deg)`;
  }

  setTimeout(() => {
    lottery.classList.remove("active");
    alert(`恭喜你获得了${prize}`);
  }, 4000);
});

示例说明

示例一

在原来的代码中,每次旋转时都需要重新计算距离。下面是优化前的代码:

const rotate = (index, deg, speed, timer) => {
  const lottery = document.querySelector(".lottery");
  const lists = lottery.querySelectorAll(".list");
  const distance = index * avgDeg - deg; // 计算距离
  let speedMod = speed;

  clearInterval(timer);

  timer = setInterval(() => {
    if (speedMod > 0 && distance < 0) {
      // 是否需要旋转到下一个转盘
      distance += 360;
    } else if (speedMod < 0 && distance > 0) {
      // 是否需要旋转到上一个转盘
      distance -= 360;
    }
    deg += speedMod;

    if (Math.abs(distance - speedMod) < Math.abs(speedMod)) {
      // 最后一步旋转到奖品
      deg += distance;
      clearInterval(timer);
    }

    distance -= speedMod;
    speedMod *= 0.98; // 加速度递减
    speedMod = speedMod < 0.1 ? 0.1 : speedMod; // 最小速度为0.1

    lists.forEach((list, i) => {
      const itemDeg = avgDeg * i;
      list.style.transform = `rotate(${deg + itemDeg}deg)`;
    });
  }, 10);

  return timer;
};

可以看到,每次计算距离的代码比较麻烦。我们可以在代码中预处理需要旋转的角度,避免重复计算。下面是优化后的代码:

const rotate = (index, deg, speed, timer) => {
  const lottery = document.querySelector(".lottery");
  const lists = lottery.querySelectorAll(".list");
  let speedMod = speed;

  clearInterval(timer);

  timer = setInterval(() => {
    deg += speedMod;
    rotateCount++;

    if (rotateCount >= rotateNum && (deg - totalAngle) % 360 == 0) {
      clearInterval(timer);
      rotateCount = 0;
      lottery.classList.remove("active");
      alert(`恭喜你获得了${prize}`);
      return;
    }

    speedMod *= 0.98;
    speedMod = speedMod < 0.1 ? 0.1 : speedMod;

    lists.forEach((list, i) => {
      const itemDeg = i * rotateUnit;
      list.style.transform = `rotate(${deg + itemDeg}deg)`;
    });
  }, 10);

  return timer;
};

示例二

在实际使用中,用户可能会连续多次点击开始按钮,这样会导致每个跑马灯都在不停地旋转,造成资源浪费。我们可以添加一些判断措施,确保每次只有一个跑马灯在旋转。下面是添加判断措施后的代码:

const lottery = document.querySelector(".lottery");
const startBtn = document.querySelector(".start-btn");
let isRunning = false; // 判断是否正在旋转

startBtn.addEventListener("click", () => {
  if (isRunning) return; // 判断是否已经在旋转

  isRunning = true;

  const prizes = ["电视", "手机", "平板电脑", "电饭煲"];
  const prizeIndex = Math.floor(Math.random() * prizes.length);
  const prize = prizes[prizeIndex];

  lottery.classList.add("active");

  let rotateCount = 0;
  const rotateUnit = 45; // 每次旋转的角度
  const rotateNum = 8; // 旋转次数
  const totalAngle = rotateNum * 360 + prizeIndex * rotateUnit; // 总的旋转角度

  for (let i = 0; i < 4; i++) {
    const list = lottery.querySelector(`.list-${i}`);
    list.style.transform = `rotate(${totalAngle}deg)`;
  }

  setTimeout(() => {
    isRunning = false;
    lottery.classList.remove("active");
    alert(`恭喜你获得了${prize}`);
  }, 4000);
});

在上面的代码中,我们添加了一个isRunning变量来判断是否正在旋转,如果已经在旋转了,就不执行后续操作。这样就可以避免资源浪费了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript实现跑马灯抽奖活动实例代码解析与优化(二) - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • jsPDF导出pdf示例

    以下是关于如何使用jsPDF导出pdf的详细攻略,包含两个示例。 什么是jsPDF jspdf是一个用于生成PDF文件的JavaScript库。它可以在浏览器端和Node.js环境中使用。它可以轻松地将HTML内容转换为PDF文件,例如HTML文本,SVG图像等。 安装jsPDF 你可以通过npm安装jsPDF: npm install jspdf –sa…

    JavaScript 2023年5月27日
    00
  • JS实现一个简单的日历

    下面是JS实现一个简单的日历的完整攻略。 步骤一:在HTML中添加日历的框架 我们先在HTML文件中添加一个日历的框架,可以采用表格的形式来呈现日历。以下是示例代码: <table> <thead> <tr> <th colspan="7"><span id="year&qu…

    JavaScript 2023年5月27日
    00
  • 如何使用JavaScript快速创建一个1到100的数组

    下面是使用JavaScript快速创建1到100的数组的攻略: 1. 使用for循环快速创建一个1到100的数组 // 创建一个长度为 100 的数组 var arr = new Array(100); for (var i = 0; i < arr.length; i++) { // 把数组的每个元素赋值为它的下标+1 arr[i] = i + 1;…

    JavaScript 2023年5月27日
    00
  • python处理cookie详解

    Python处理Cookie详解 在使用网络爬虫进行数据采集的过程中,常常需要处理网站返回的Cookie信息。本文将详细讲解如何使用Python处理Cookie。 什么是Cookie Cookie是一种在访问网站时,由网站服务器发送到用户浏览器的数据,用于记录用户信息、个人偏好和浏览历史等。Cookie可以取代session来进行用户状态的跟踪,且更加灵活。…

    JavaScript 2023年6月11日
    00
  • 详解ASP.NET Core MVC四种枚举绑定方式

    接下来我会详细讲解ASP.NET Core MVC四种枚举绑定方式的完整攻略。 ASP.NET Core MVC四种枚举绑定方式 在ASP.NET Core MVC中,我们可以使用四种方式来绑定枚举类型的值。以下是介绍这些方式的详细说明。 1. 基于字符串的方式:BindAttribute 在控制器中处理POST请求时,如果我们需要绑定到枚举类型的值,可以使…

    JavaScript 2023年6月11日
    00
  • js屏蔽退格键(backspace或者叫后退键与F5)

    下面是 JS 屏蔽退格键(backspace)和F5键的完整攻略,包含了两个示例说明: 如何屏蔽退格键和F5键 当用户在执行操作的时候,有时候不希望用户误操作将页面刷新或者回退,所以需要屏蔽一些按键,比如退格键和F5键。下面就来讲解具体的屏蔽方式。 屏蔽退格键(backspace) document.onkeydown = function() { if (…

    JavaScript 2023年6月11日
    00
  • jquery js 获取时间差、时间格式具体代码

    获取时间差和时间格式化在开发中是常见的需求。JQuery是一个广泛使用的JavaScript库,它提供了方便的方式来获取时间差和时间格式。在下面的攻略中,我们将介绍如何使用JQuery获取时间差和格式化时间的具体代码。 获取时间差 我们可以使用Date对象和JQuery的时间选择器来获取时间差。具体步骤如下: 创建两个Date对象,表示要比较的两个时间。 j…

    JavaScript 2023年5月27日
    00
  • JS实现的简单表单验证功能完整实例

    下面是JS实现的简单表单验证功能完整实例的攻略。 标题 JS实现的简单表单验证功能完整实例 步骤说明 第一步:HTML部分 在HTML页面中,需要根据需求设置表单元素,包括表单元素的类型、属性以及相关样式。示例如下: <!DOCTYPE html> <html> <head> <title>表单验证</t…

    JavaScript 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部