微信页面倒计时代码(解决safari不兼容date的问题)

接下来我将为您详细讲解如何在微信页面中使用倒计时代码,并解决 Safari 不兼容 Date 的问题。

标准的倒计时代码

首先,我们先来看一下在常规网页中使用的倒计时代码:

function countDown(second, callback) {
  let timer = setInterval(() => {
    callback(second--)
    if (second < 0) {
      clearInterval(timer)
    }
  }, 1000)
}

以上代码定义了一个 countDown 函数,传入倒计时秒数和回调函数,并使用 setInterval 以每秒 1000 毫秒的频率执行回调函数并倒计时,直到时间为 0。

在微信浏览器中常常会遇到 Safari 不兼容 Date 的问题,为了解决这个问题,我们需要使用正则表达式来将日期字符串转化为时间戳:

解决 Safari 不兼容 Date 的问题

function countDownSafari(second, callback) {
  let startTime = Date.parse(new Date()) / 1000
  let timer = setInterval(() => {
    let now = new Date()
    let endTime = Date.parse(now) / 1000
    let lag = endTime - startTime
    let timestamp = second - lag
    if (timestamp < 0) {
      clearInterval(timer)
      return
    }
    callback(timestamp)
  }, 1000)
}

以上代码首先获取当前时间戳并记录,借助 setInterval 获取某个时间点的时间戳并计算时间差,在 Safari 中也能够正常倒计时。在倒计时函数的回调中,我们将倒计时的秒数传入回调函数,可以根据需求将其展示在页面上。

接下来,我们来看两个具体的使用场景示例。

示例 1:倒计时兑换

假如我们需要实现一个倒计时兑换功能,当用户购买某个商品后,需要在 5 分钟之内进行兑换,否则兑换的机会就会失去。那么我们可以这么实现:

let exchangeTime = 5 * 60  // 兑换时间 5 分钟
let canExchange = true  // 是否可以进行兑换

// 点击兑换按钮的事件处理函数
function onClickExchange() {
  if (canExchange) {
    canExchange = false  // 设置不可再次兑换
    countDownSafari(exchangeTime, (timestamp) => {
      if (timestamp === 0) {
        canExchange = true  // 重新设置可用性
      }
      updateCountDownWithSecond(timestamp)
    })
  }
}

// 更新页面倒计时的函数
function updateCountDownWithSecond(second) {
  const minute = Math.floor(second / 60)
  const sec = second % 60
  const minuteStr = appendPrefixNumber(minute)
  const secStr = appendPrefixNumber(sec)
  const timeStr = `${minuteStr}:${secStr}`
  const countDownText = document.querySelector('.count-down-text')
  countDownText.innerText = timeStr
}

// 补全数字前缀
function appendPrefixNumber(num) {
  return num < 10 ? `0${num}` : num
}

以上代码中,点击兑换按钮时会首先判断是否可进行兑换,如果是,则调用倒计时函数开始倒计时,如果在倒计时过程中时间到了,就会重新设置兑换为可用状态,否则在页面上调用 updateCountDownWithSecond 函数来更新倒计时,而 appendPrefixNumber 函数则是为了保证倒计时数字占两位数,避免出现 1:3 这种丑陋的显示。

示例 2:倒计时抽奖

接下来假设我们需要实现一个倒计时抽奖功能,每隔一定时间就会随机抽取一名中奖用户,但是需要在页面上显示明确的倒计时。这个功能同样可以用我们上面提到的倒计时代码实现:

let drawInterval = 10  // 抽奖间隔 10 秒

// 点击开始抽奖按钮的事件处理函数
function onClickStartDraw() {
  setDrawInterval()
}

// 设置随机抽奖的间隔函数
function setDrawInterval() {
  countDownSafari(drawInterval, (timestamp) => {
    if (timestamp === 0) {
      doDraw()
      setDrawInterval()
    }
    updateCountDownWithSecond(timestamp)
  })
}

// 进行随机抽奖的函数
function doDraw() {
  const userList = ['user1', 'user2', 'user3', 'user4', 'user5']
  const luckyIndex = Math.floor(Math.random() * userList.length)
  const luckyUser = userList[luckyIndex]
  console.log(`恭喜 ${luckyUser} 中奖!`)
}

以上代码中,在点击开始抽奖按钮的事件处理函数中,我们首先调用了setDrawInterval,这个函数是借助倒计时函数实现的,每隔 10 秒就会调用一次 doDraw 函数完成随机抽奖的功能,如果在 10 秒的倒计时过程中用户又再次点击了“开始抽奖”按钮,就需要取消之前的倒计时,重新进行倒计时,这个可以通过 setTimeoutclearTimeout 来实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信页面倒计时代码(解决safari不兼容date的问题) - Python技术站

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

相关文章

  • 页面只能打开一次Cooike如何实现

    实现页面只能打开一次 Cookie 的方法可以通过在用户访问首次打开页面时,设置一个标记位cookie,如果后续用户再次访问相同的页面,判断是否存在该标记位。 下面给出两条示例来说明如何实现: 示例一:使用JavaScript和Cookie实现页面只能打开一次 JavaScript中可以使用 document.cookie 来获取、设置、删除cookie。我…

    JavaScript 2023年6月11日
    00
  • JavaScript 数组的深度复制解析

    JavaScript 数组的深度复制解析 什么是数组的深度复制? 数组的深度复制是指将一个数组中的所有元素和子数组全部复制,并创建一个全新独立的数组,其中元素或子数组任意一项发生变化,也不会影响原始数组中的元素和子数组。 实现数组的深度复制 在 JavaScript 中,实现数组的深度复制需要借助递归方法来完成。下面是一个常用的代码示例: function …

    JavaScript 2023年5月27日
    00
  • javascript打印输出json实例

    让我来详细讲解一下“JavaScript 打印输出 JSON 实例”的完整攻略。 首先,我们需要了解 JSON 是什么。JSON 是一种轻量级的数据格式,其特点是易于阅读和编写。在 Web 开发中,常常使用 JSON 来传输数据。在 JavaScript 中,可以将一个 JSON 对象转换成字符串,也可以将一个字符串转换成 JSON 对象。 接着,我们需要了…

    JavaScript 2023年5月27日
    00
  • JS 文件本身编码转换 图文教程

    下面为您详细讲解“JS 文件本身编码转换 图文教程”的完整攻略。 背景 当我们在编写JavaScript文件时,有时候文件的编码格式与我们所需要的格式不一致,这时就需要进行编码转换,以确保文件在不同平台和浏览器中的正确展示。 方法 文件编码转换有多种方法,本文将主要介绍两种方法。 方法一:使用VSCode 在VSCode中,我们可以通过如下步骤进行文件编码转…

    JavaScript 2023年5月20日
    00
  • 详解Angular操作cookies方法

    以下是详解Angular操作cookies方法的完整攻略: 1. 什么是cookies Cookies 是指在浏览器中存储小型文本数据的一种机制,它们通常用于跟踪用户、记住用户的偏好设置等功能。 2. 在Angular中使用cookies 通常在Angular中使用第三方库来操作cookies。这里介绍两个常用的库: ngx-cookie-service n…

    JavaScript 2023年6月11日
    00
  • JavaScript事件对象event用法分析

    下面是关于JavaScript事件对象(event)的详细解析: 一、什么是JavaScript事件对象(event) 在JavaScript中,事件是当HTML文档中发生某些特定行为时所发生的结果。比如用户单击了一个按钮、鼠标移动到某一个元素上等交互行为。这些都可以被JavaScript捕捉到,并进行相应的处理。在这些事件中,事件对象(event)是事件发…

    JavaScript 2023年6月10日
    00
  • Javascript基础知识(三)BOM,DOM总结

    Javascript基础知识(三)BOM,DOM总结 BOM(浏览器对象模型) 浏览器对象模型(BOM)提供了一组与浏览器窗口有关的对象,有助于操作浏览器窗口和屏幕显示。BOM是由浏览器厂商自行定义的,因此不属于W3C标准。 BOM的核心对象是window对象,表示浏览器窗口和页面。window对象还可以通过自身属性和方法来操作浏览器窗口、页面、框架、历史记…

    JavaScript 2023年6月10日
    00
  • js中apply和call的理解与使用方法

    下面是关于“js中apply和call的理解与使用方法”的完整攻略: 一、概述 在 JavaScript 中,call() 和 apply() 都是 Function 原型对象上的方法,主要用于改变函数运行时的上下文对象(即 this 指向)。 在使用时,两者的区别主要在于传递参数的方式不同。call() 接收的是一个参数列表,而 apply() 接收的是一…

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