Js如何做一个计时器,点击奇数次延续计时,偶数次延缓计时?求解答!
<script>
let timerValue = 0;
let timerInterval;
function toggleTimer() {
const toggleButton = document.getElementById('toggle');
if (toggleButton.value === 'start') {
toggleButton.value = 'stop';
toggleButton.textContent = 'Stop';
timerInterval = setInterval(function() {
timerValue++;
updateTimer();
}, 1000);
} else {
toggleButton.value = 'start';
toggleButton.textContent = 'Start';
clearInterval(timerInterval);
}
}
function updateTimer() {
const timerDiv = document.getElementById('timer');
const hours = Math.floor(timerValue / 3600);
const minutes = Math.floor((timerValue - (hours * 3600)) / 60);
const seconds = timerValue - (hours * 3600) - (minutes * 60);
timerDiv.textContent = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
}
</script>
<div id="timer">00:00:00</div>
<button id="toggle" value="start" onclick="toggleTimer()">Start</button>
//获取到计时器的DOM元素
var timerElement = document.getElementById('timer');
var count = 0;
var timerInterval = null;
//点击计时器时触发的函数
timerElement.addEventListener('click', function() {
count++; //每次点击计数器,计数器加1
//如果为奇数次点击,则让计时器每秒递增1
if (count % 2 !== 0) {
if (timerInterval) clearInterval(timerInterval);
timerInterval = setInterval(function() {
timerElement.textContent = parseInt(timerElement.textContent) + 1;
}, 1000);
} else { //如果为偶数次点击,则暂停计时器
clearInterval(timerInterval);
timerInterval = null;
}
});
这个代码中,我们绑定了一个点击事件来触发计时器的操作。使用count变量来记录点击次数,如果是奇数次点击,就创建一个setInterval来每秒递增计时器的值,如果是偶数次点击,则关闭计时器。最后将计时器的DOM元素赋值给timerElement变量,并将点击事件绑定到该元素上。
要知道,比方一个数组 arr =[{a:1,b:2}],这个数组arr存储在一个地址中,而其中的arr[0].a存储的地址却是里另一个地址,相当于引用传递,这时简单的深拷贝将不能拷贝这个深层级的拷贝
多层级拷贝错误示例:
var arr1 = [{a:1,b:1}]
let newArr1 = arr1.slice(0)
newArr1.forEach(item=>{
delete item.a
})
console.log(arr1,'原数组'); //[{b:1}] "原数组"
console.log(newArr1,'拷贝数组') //[{b:1}] "拷贝数组"
//第二种
var arr2 = [[1,2,3],[2,3,4]]
let newArr2 = []
for(var i=0 ;i<arr2.length;i++){
newArr2.push(arr2[i])
}
newArr2.forEach(item=>{
item.splice(0,1)
})
console.log(arr2,'原数组'); //[[2,3],[3,4]] "原数组"
console.log(newArr2,'拷贝数组') //[[2,3],[3,4]] "拷贝数组"
以上是无法实现多层级拷贝,但是JSON.stringify() ,JSON.parse() 却可以
var arr1 = [{a:1,b:1}]
let newArr4 = JSON.parse(JSON.stringify(arr1))
newArr4.forEach(item=>{
delete item.a
})
console.log(arr1,'原数组'); //[{a:1,b:1}] "原数组"
console.log(newArr4,'拷贝数组') //[{b:1}] "拷贝数组"
换一个思路,既然每一层的地址不同,我们何不遍历每一层的拷贝呢
var arr1 = [{a:1,b:1}]
function clone(obj){
if (obj instanceof Array) {
var copy = [];
for (var i = 0, len = obj.length; i < len; ++i) {
copy[i] = clone(obj[i]);
}
return copy;
}
}
let newArr5 = clone(arr1)
newArr5.forEach(item=>{
delete item.a
})
console.log(arr1,'原数组'); //[{a:1,b:1}] "原数组"
console.log(newArr5,'拷贝数组') //[{b:1}] "拷贝数组"
当然不同的对象有不同的clone,以下是笔者封装的方法适用于多种对象
function clone(obj) {
// 判断是否为空未定义
if (null == obj || "object" != typeof obj) return obj;
// Date
if (obj instanceof Date) {
var copy = new Date();
copy.setTime(obj.getTime());
return copy;
}
// Array
if (obj instanceof Array) {
var copy = [];
for (var i = 0, len = obj.length; i < len; ++i) {
copy[i] = clone(obj[i]);
}
return copy;
}
// Object
if (obj instanceof Object) {
var copy = {};
for (var attr in obj) {
if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]);
}
return copy;
}
throw new Error("无法复制对象!不支持其类型。");
}
我可以为您提供以下思路:
定义一个全局变量count用来记录按钮被点击的次数,初始值为0。
监听按钮的点击事件,每次点击后将count加1。
根据count的奇偶性来决定计时器的速度,奇数次点击正常速度,偶数次点击减缓速度。
在计时器中使用setInterval函数来实现定时器的功能,在每个时间点上更新计时器的显示。
以下是代码示例(基于jQuery):
// 定义全局变量count
var count = 0;
// 监听按钮的点击事件
$('button').click(function() {
count++; // 每次点击count加1
});
// 定义计时器相关变量
var timerCount = 0; // 计时器的初始值为0
var delay = 1000; // 计时器的初始速度为每秒1次
var timerId = setInterval(function() {
// 根据count的奇偶性决定计时器的速度
if (count % 2 === 0) {
delay = 2000; // 偶数次点击减缓速度
} else {
delay = 1000; // 奇数次点击正常速度
}
// 更新计时器的显示
$('#timer').text(timerCount++);
}, delay);
在以上代码中,定义了全局变量count用来记录按钮的点击次数,用计时器相关变量来实现计时器的功能。在setInterval函数中,根据count的奇偶性来决定计时器的速度,偶数次点击减缓速度,奇数次点击正常速度,同时更新计时器的显示。