返回

如何在单页中运行多个具有不同时间戳的 jQuery 定时器?

javascript

## 单页中运行具有独立时间戳的多个 jQuery 定时器

问题

在一个页面上存在多个定时器,每个定时器都对应着一个不同的比赛。当比赛结束时,这些定时器开始计时。当用户点击“完成比赛”按钮时,比赛状态会变为“完成”,并且根据从 Ajax 请求中接收的开始时间和结束时间启动定时器。问题在于,当一个比赛完成时,第一个定时器运行良好,但第二个、第三个等定时器应该基于它们自己的定时器运行,因为它们的时间段不同。但目前,所有定时器都与第一个定时器相同。

解决方案

解决此问题的关键在于为每个定时器维护独立的状态和变量。以下是如何实现这一目标的步骤:

  1. 创建计时器对象: 为每个定时器创建一个对象,该对象将包含其状态、变量和方法。
  2. 初始化计时器: 在页面加载时,遍历所有计时器元素并为每个元素创建一个计时器对象,初始化其属性。
  3. 处理点击事件: 当用户点击“完成比赛”按钮时,获取相关比赛的计时器对象并将其状态更改为“活动”。
  4. 启动计时器: 如果计时器处于“活动”状态,则从服务器请求开始时间和结束时间,并使用这些信息启动计时器。
  5. 更新计时器: 使用 setInterval() 函数以定期间隔更新计时器的显示。
  6. 停止计时器: 当计时器达到结束时间时,将其状态更改为“完成”并停止更新其显示。

代码示例

以下是一个使用 jQuery 实现此解决方案的代码示例:

$(function() {
  // 计时器对象
  var timers = {};

  // 初始化计时器
  $('.multi-match-timer').each(function() {
    var id = $(this).children('input[name=matchRowID]').val();
    timers[id] = {
      state: 'idle',
      startTime: null,
      endTime: null,
      interval: null
    };
  });

  // 处理点击事件
  $('.complete-match-btn').click(function() {
    var id = $(this).closest('.match-row-info').find('input[name=matchRowID]').val();
    timers[id].state = 'active';
    startTimer(id);
  });

  // 启动计时器
  function startTimer(id) {
    var timer = timers[id];

    // 获取开始时间和结束时间
    $.ajax({
      url: '/get-match-times',
      data: { id: id },
      success: function(data) {
        timer.startTime = data.startTime;
        timer.endTime = data.endTime;

        // 使用开始时间和结束时间启动计时器
        timer.interval = setInterval(function() { updateTimer(id); }, 1000);
      }
    });
  }

  // 更新计时器
  function updateTimer(id) {
    var timer = timers[id];

    // 计算剩余时间
    var remaining = timer.endTime - new Date().getTime();

    // 转换剩余时间为时、分、秒格式
    var hours = Math.floor(remaining / (1000 * 60 * 60));
    var minutes = Math.floor((remaining % (1000 * 60 * 60)) / (1000 * 60));
    var seconds = Math.floor((remaining % (1000 * 60)) / 1000);

    // 更新计时器显示
    $('#match-row-info-' + id + ' .match-timer').text(hours + ':' + minutes + ':' + seconds);

    // 如果时间到,则停止计时器
    if (remaining <= 0) {
      clearInterval(timer.interval);
      timer.state = 'completed';
    }
  }
});

结论

本文介绍了一种在单页中使用 jQuery 运行多个具有不同时间戳的定时器的方法。通过为每个定时器维护独立的状态和变量,我们可以确保每个定时器都根据其自己的时间段运行,而不会相互干扰。

常见问题解答

1. 如何在没有服务器端 API 的情况下实现此解决方案?

如果你没有服务器端 API 来提供开始时间和结束时间,则可以使用客户端 JavaScript 来模拟这些时间。可以使用 Date.now() 函数获取当前时间,并在用户点击“完成比赛”按钮时将其存储为开始时间。然后,可以使用指定的持续时间(以毫秒为单位)来计算结束时间。

2. 如何以不同的格式显示时间?

你可以修改 updateTimer() 函数来以不同的格式显示时间。例如,你可以显示为毫秒、分钟或秒。

3. 如何停止所有定时器?

你可以遍历 timers 对象并清除所有定时器的间隔。

4. 如何暂停和恢复定时器?

你可以为每个定时器添加一个布尔标志来表示其状态。当需要暂停定时器时,将标志设置为 false,当需要恢复定时器时,将其设置为 true。在 updateTimer() 函数中,检查标志并根据需要更新计时器。

5. 如何将此解决方案用于不同的计时器类型?

此解决方案可以用于各种计时器类型,例如倒计时、秒表或时钟。只需修改计时器的实现以匹配所需的类型即可。