微信页面倒计时代码(解决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日

相关文章

  • Javascript中的delete介绍

    当我们在JavaScript中创建一个对象或者函数时,它们都会被存储在内存中,而使用 delete 关键字可以删除对象的某个属性或者函数。本文将详细讲解 delete 的用法,以及可能会遇到的问题。 语法 delete object.propertyName delete object[expression] delete object.functionNa…

    JavaScript 2023年6月10日
    00
  • Javascript 各浏览器的 Javascript 效率对比

    首先,为了详细讲解JavaScript各浏览器的效率对比,我们需要先了解一下什么是JavaScript。简单地说,JavaScript是一种通过浏览器来运行的脚本语言,主要用于网页的动态交互和视觉效果制作。 在JavaScript的效率对比方面,一般使用各个浏览器所支持的benchmark测试来进行比较。benchmark测试是一个基准测试套件,它被用来测量…

    JavaScript 2023年5月19日
    00
  • javascript动态获取登录时间和在线时长

    1. 获取登录时间 在Javascript中获取登录时间需要使用Date对象。可以在用户登录时记录服务器端的时间戳,然后将时间戳传递给前端,使用Date对象将时间戳转换成具体的日期时间,最后将日期时间显示在页面上。 例如,假设用户登录时服务器端返回的时间戳为 1574825471373,那么我们可以使用以下代码将时间戳转换成日期时间: const login…

    JavaScript 2023年5月27日
    00
  • asp javascript值的互相传递方法

    ASP是一种服务器端脚本语言,而JavaScript则是一种客户端脚本语言,它们可以通过不同的方式进行值的互相传递。以下是几种常见的方法: 在URL中传递数据 URL中可以包含参数,我们可以将ASP页面中的变量作为参数传递,然后通过JavaScript解析URL,获取参数值。例如: ASP页面中的代码: <% Dim name name = &quot…

    JavaScript 2023年6月11日
    00
  • JavaScript数组去重的方法总结【12种方法,号称史上最全】

    我将根据您提供的问题,详细讲解如何使用JavaScript实现数组去重。请注意,这是一个12种方法的综合总结,包括常规的方法和使用ES6的新语法实现的方法,希望您能够学到一些有用的知识。 一、常规方法 1. 使用for循环双重遍历 该方法使用两重循环遍历整个数组,内部循环从外部循环的下一个元素开始,如果找到一个与当前元素相同的元素,则将其从数组中删除。时间复…

    JavaScript 2023年5月27日
    00
  • JS document对象简单用法完整示例

    让我们来详细讲解“JS document对象简单用法完整示例”的攻略。文本将被分为几个部分:介绍什么是document对象、document对象的一些属性和方法、示例说明。 什么是document对象? document 对象是指代整个文档的根节点,所有的HTML元素都是文档的后代,可以通过该对象来操作 HTML 页面。 document对象的属性和方法 d…

    JavaScript 2023年5月27日
    00
  • 利用JS实现AI自动玩贪吃蛇

    实现AI自动玩贪吃蛇的具体步骤一般包括以下几个部分: 1. 实现贪吃蛇游戏逻辑 首先,需要实现贪吃蛇游戏的基本逻辑,包括蛇的移动、食物生成、吃食物、增长等功能。这部分的代码实现方式可以参考一些贪吃蛇游戏的教程和示例代码,例如利用canvas绘制贪吃蛇游戏界面及游戏逻辑等。具体实现方法可以参考下面的示例: // 初始化贪吃蛇游戏界面 var canvas = …

    JavaScript 2023年6月10日
    00
  • asp.net core3.1cookie和jwt混合认证授权实现多种身份验证方案

    针对这个话题我将给出详细的攻略,内容如下: asp.net core3.1cookie和jwt混合认证授权实现多种身份验证方案 简介 在asp.net core3.1中,使用cookie和jwt混合认证授权的方式来实现多种身份验证方案非常实用,本文将详细讲解在asp.net core3.1中如何实现这样的混合认证授权机制。 实现cookie和jwt的混合认证…

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