如何在单页中运行多个具有不同时间戳的 jQuery 定时器?
2024-03-16 11:50:00
## 单页中运行具有独立时间戳的多个 jQuery 定时器
问题
在一个页面上存在多个定时器,每个定时器都对应着一个不同的比赛。当比赛结束时,这些定时器开始计时。当用户点击“完成比赛”按钮时,比赛状态会变为“完成”,并且根据从 Ajax 请求中接收的开始时间和结束时间启动定时器。问题在于,当一个比赛完成时,第一个定时器运行良好,但第二个、第三个等定时器应该基于它们自己的定时器运行,因为它们的时间段不同。但目前,所有定时器都与第一个定时器相同。
解决方案
解决此问题的关键在于为每个定时器维护独立的状态和变量。以下是如何实现这一目标的步骤:
- 创建计时器对象: 为每个定时器创建一个对象,该对象将包含其状态、变量和方法。
- 初始化计时器: 在页面加载时,遍历所有计时器元素并为每个元素创建一个计时器对象,初始化其属性。
- 处理点击事件: 当用户点击“完成比赛”按钮时,获取相关比赛的计时器对象并将其状态更改为“活动”。
- 启动计时器: 如果计时器处于“活动”状态,则从服务器请求开始时间和结束时间,并使用这些信息启动计时器。
- 更新计时器: 使用
setInterval()
函数以定期间隔更新计时器的显示。 - 停止计时器: 当计时器达到结束时间时,将其状态更改为“完成”并停止更新其显示。
代码示例
以下是一个使用 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. 如何将此解决方案用于不同的计时器类型?
此解决方案可以用于各种计时器类型,例如倒计时、秒表或时钟。只需修改计时器的实现以匹配所需的类型即可。