同一页面多个商品倒计时JS 基于面向对象的javascript

yizhihongxing

同一页面多个商品倒计时JS 基于面向对象的javascript

在电商网站中,多个商品可能需要倒计时进行限时抢购,这就需要一个基于面向对象的JavaScript代码来实现同时倒计时多个商品的功能。

  1. 实现思路

  2. 倒计时插件封装:封装一个倒计时插件,基于面向对象的设计,实现倒计时功能。

  3. 商品对象封装:封装商品对象,其中包含了商品倒计时功能,以及与页面交互的方法。
  4. 商品列表管理:商品管理通过维护一个商品列表,实现对所有商品的统一管理。

  5. 倒计时插件封装

倒计时插件是整个多个商品倒计时JS实现中最重要的部分,一个好的倒计时插件可以实现代码的复用,也可避免在后期维护过程中出现问题。下面我们来实现一个基于面向对象的倒计时插件。

var Countdown = function(options) {
  this.init(options);
};

Countdown.prototype = {
  constructor: Countdown,
  init: function(options) {
    this.options = {
      endDate: new Date(),
      onStart: function() {},
      onEnd: function() {},
      onTimeUpdate: function() {}
    };
    for (key in options) {
      if (options.hasOwnProperty(key)) {
        this.options[key] = options[key];
      }
    }
    this.options.daysNode.innerHTML = "00";
    this.options.hoursNode.innerHTML = "00";
    this.options.minutesNode.innerHTML = "00";
    this.options.secondsNode.innerHTML = "00";
    this.start();
  },
  start: function() {
    var self = this;
    this.options.onStart();

    setInterval(function() {
      var end = new Date(self.options.endDate);
      var now = new Date();
      var seconds = parseInt((end.getTime() - now.getTime()) / 1000);
      if (seconds < 0) {
        self.options.onEnd();
        return;
      }

      var days = Math.floor(seconds / (3600 * 24));
      seconds = seconds - days * 3600 * 24;
      var hours = Math.floor(seconds / 3600);
      seconds = seconds - hours * 3600;
      var minutes = Math.floor(seconds / 60);
      seconds = seconds - minutes * 60;

      self.options.daysNode.innerHTML = self.formatNumber(days);
      self.options.hoursNode.innerHTML = self.formatNumber(hours);
      self.options.minutesNode.innerHTML = self.formatNumber(minutes);
      self.options.secondsNode.innerHTML = self.formatNumber(seconds);

      self.options.onTimeUpdate();
    }, 1000);
  },
  formatNumber: function(number) {
    return number < 10 ? "0" + number.toString() : number.toString();
  }
};
  1. 商品对象封装

每个商品需要一个独立的倒计时插件进行倒计时。根据前面的倒计时插件,我们可以很容易地封装一个商品对象来实现每个商品的倒计时功能。下面是实现代码:

var Product = function(options) {
  this.init(options);
};

Product.prototype = {
  constructor: Product,

  init: function(options) {
    var self = this;
    this.options = options;
    this.countdown = new Countdown({
      startDate: this.options.startDate,
      endDate: this.options.endDate,
      daysNode: this.options.daysNode,
      hoursNode: this.options.hoursNode,
      minutesNode: this.options.minutesNode,
      secondsNode: this.options.secondsNode,
      onStart: function() {
        self.options.onStart && self.options.onStart();
      },
      onEnd: function() {
        self.options.onEnd && self.options.onEnd();
      },
      onTimeUpdate: function() {
        self.options.onTimeUpdate && self.options.onTimeUpdate();
      }
    });
  },

  start: function() {
    this.countdown.start();
  },

  stop: function() {
    clearInterval(this.countdown);
  }
};

在商品对象中,我们创建了一个倒计时对象,并通过传递参数来实现倒计时功能。同时,我们还封装了start和stop方法来控制商品倒计时的开始和结束。

  1. 商品列表管理

最后,为了让多个商品同时进行倒计时,我们需要维护一个商品列表,在该列表中存储所有商品实例。当需要进行倒计时时,我们可以遍历商品列表,分别对每一个商品进行倒计时。实现代码如下:

var ProductList = function(options) {
  this.init(options);
};

ProductList.prototype = {
  constructor: ProductList,

  init: function(options) {
    var self = this;
    this.options = options || {};
    this.products = [];
    this.loadProducts();
  },

  loadProducts: function() {
    var self = this;
    var productElements = document.querySelectorAll(".product");
    for (var i = 0; i < productElements.length; i++) {
      var el = productElements[i];
      var startDate = new Date();
      var endDate = new Date(
        el.getAttribute("data-end-date")
      );
      var daysNode = el.querySelector(".days");
      var hoursNode = el.querySelector(".hours");
      var minutesNode = el.querySelector(".minutes");
      var secondsNode = el.querySelector(".seconds");

      var product = new Product({
        startDate: startDate,
        endDate: endDate,
        daysNode: daysNode,
        hoursNode: hoursNode,
        minutesNode: minutesNode,
        secondsNode: secondsNode,
        onStart: function() {},
        onEnd: function() {},
        onTimeUpdate: function() {}
      });

      self.products.push(product);
      product.start();
    }
  },

  stopAllProducts: function() {
    for (var i = 0; i < this.products.length; i++) {
      var product = this.products[i];
      product.stop();
    }
  }
};

var productList = new ProductList();

在ProductList的loadProducts方法中,我们遍历查找所有商品的元素,并实例化每一个商品对象。之后,通过start方法启动倒计时。

  1. 示例说明

下面是两条示例说明,分别演示基于面向对象的多个商品倒计时的实现。

<html>
<head>
    <title>多个商品倒计时JS示例一</title>
    <script src="countdown.js"></script>
    <script>
        var productList = new ProductList();
    </script>
</head>
<body>
    <div id="product1" class="product" data-end-date="2022-05-01T00:00:00+00:00">
        <div class="days"></div><div class="hours"></div><div class="minutes"></div><div class="seconds"></div>
    </div>
    <div id="product2" class="product" data-end-date="2022-06-01T00:00:00+00:00">
        <div class="days"></div><div class="hours"></div><div class="minutes"></div><div class="seconds"></div>
    </div>
</body>
</html>

上面代码中,我们实例化了一个商品列表,并通过data-end-date属性来设置每一个商品的截止时间。

<html>
<head>
    <title>多个商品倒计时JS示例二</title>
    <script src="countdown.js"></script>
</head>
<body>
    <div id="product1" class="product">
        <div class="days"></div><div class="hours"></div><div class="minutes"></div><div class="seconds"></div>
    </div>
    <div id="product2" class="product">
        <div class="days"></div><div class="hours"></div><div class="minutes"></div><div class="seconds"></div>
    </div>
    <script>
        var product1 = new Product({
            startDate: new Date(),
            endDate: new Date(Date.now()+30000),
            daysNode: document.querySelector('#product1 .days'),
            hoursNode: document.querySelector('#product1 .hours'),
            minutesNode: document.querySelector('#product1 .minutes'),
            secondsNode: document.querySelector('#product1 .seconds'),
        });

        var product2 = new Product({
            startDate: new Date(),
            endDate: new Date(Date.now()+20000),
            daysNode: document.querySelector('#product2 .days'),
            hoursNode: document.querySelector('#product2 .hours'),
            minutesNode: document.querySelector('#product2 .minutes'),
            secondsNode: document.querySelector('#product2 .seconds'),
        });

        product1.start();
        product2.start();
    </script>
</body>
</html>

在上面代码中,我们手动实例化了两个商品,使用了具体的截止时间,而非从页面中获取值。

注意事项:

  • 在倒计时过程中,需要轮询更新时间来更新商品显示信息,使用setInterval函数即可实现。
  • 添加商品时,需要传入每个商品的相关信息,包括开始时间、结束时间、商品元素节点等。
  • 商品列表更新时,需要停止之前的所有倒计时,并重新开始。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:同一页面多个商品倒计时JS 基于面向对象的javascript - Python技术站

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

相关文章

  • JS操作Cookies包括(读取添加与删除)

    JS操作Cookies是指在网页上使用JavaScript语言来读取、添加和删除HTTP Cookies的过程。常见的应用场景包括存储用户会话信息、记录用户偏好和跟踪用户行为等。下面是JS操作Cookies的完整攻略。 1. 读取Cookies 读取Cookies的方式是通过document.cookie属性来读取当前域名下的所有Cookies。docume…

    JavaScript 2023年6月10日
    00
  • js时间戳格式化成日期格式的多种方法

    接下来我将详细讲解js时间戳格式化成日期格式的多种方法。 1. 使用Date对象 js内置的Date对象提供了多种方法将时间戳格式化为日期格式。其中,最简单的方法就是使用Date对象的toLocaleDateString()方法。该方法将根据本地时间将时间戳解析为日期字符串: const date = new Date(1234567890123); con…

    JavaScript 2023年5月27日
    00
  • JavaScript中常见的字符串操作函数及用法汇总

    JavaScript中常见的字符串操作函数及用法汇总 JavaScript中有很多字符串操作函数,这篇攻略将会讲解其中常见的一些函数及其用法。我们来详细了解一下吧。 字符串的创建 字符串可以通过两种方式创建,分别是双引号和单引号。 var str1 = "JavaScript"; // 使用双引号创建字符串 var str2 = ‘Jav…

    JavaScript 2023年5月19日
    00
  • 获取阴历(农历)和当前日期的js代码

    获取阴历(农历)和当前日期是网站中常见的功能之一。使用JavaScript实现这个功能需要借助第三方库或者手写算法。 一、使用第三方库 推荐使用lunar-calendar这个JavaScript库,该库提供了方便的API实现将阳历日期转换为阴历日期。在获取当前日期的情况下,可以直接使用JavaScript的Date对象获取。具体步骤如下: 下载lunar-…

    JavaScript 2023年5月27日
    00
  • 原生JS获取元素的位置与尺寸实现方法

    获取元素位置和尺寸信息是web开发中经常需要面对的问题。下面是一些原生JS获取元素位置和尺寸的方法。在示例中,我们将使用一个html文档和一个div元素作为示例。 获取元素位置 offsetTop和offsetLeft属性 在HTML文档中,每个元素都有offsetTop和offsetLeft属性,它们表示元素相对于其offsetParent(父元素)的顶部…

    JavaScript 2023年6月11日
    00
  • js document.getElementsByClassName的使用介绍与自定义函数

    让我们来详细讲解一下 “document.getElementsByClassName” 的使用介绍与自定义函数的完整攻略。 1. document.getElementsByClassName() 的介绍 document.getElementsByClassName() 是一个 JavaScript 函数,用于获取页面上所有指定 class 属性的元素。…

    JavaScript 2023年6月10日
    00
  • 一看就懂:jsonp详解

    一看就懂:jsonp详解 什么是JSONP JSONP(JSON with Padding)是一种跨域的数据交互方式。它利用了script标签没有跨域限制的特点,通过动态创建script标签来请求服务器返回数据,并通过回调函数来处理返回的数据。 JSONP的原理 在客户端动态创建一个script标签,其中的src属性指向服务器端数据接口,并在接口地址中指定回…

    JavaScript 2023年5月27日
    00
  • javascript日期计算实例分析

    当我们构建一个网页或者web应用时,经常需要处理日期的计算。在JavaScript中,我们可以通过Date对象来实现日期的相关操作。 下面是一些具体的示例说明: 示例1:计算两个日期之间的天数 假设我们有两个日期,一个起始日期和一个结束日期。我们需要计算这两个日期之间的天数。可以使用以下代码: // 定义两个日期 let startDate = new Da…

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