jQuery:window.timer 对多个元素使用 setTimeout 和 setInterval 时出现问题
jQuery: Issue with window.timer using setTimeout and setInterval for multiple elements
我有多个函数使用 window 计时器来创建动画和事件,但是一旦我添加了多个函数,动作就不会像我猜的那样运行,因为 window.timer 重叠
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
viewBox="0 0 200 200" preserveAspectRatio="none" class="circle_svg">
<circle cx="100" cy="100" r="80" id="green-halo" fill="none" stroke="#00CC33" stroke-width="23"
stroke-dasharray="0,20000" transform="rotate(-95,100,100)" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
viewBox="0 0 200 200" preserveAspectRatio="none" class="circle_svg2">
<circle cx="100" cy="100" r="80" id="green-halo2" fill="none" stroke="#00CC33" stroke-width="3"
stroke-dasharray="0,20000" transform="rotate(-95,100,100)" />
</svg>
setTimeout(drawCircle, 1500);
setTimeout(drawCircle2, 1500);
function drawCircle() {
var circle = document.getElementById('green-halo');
var interval = 30;
var angle = 0;
var angle_increment = 6;
var max_angle = 384;
window.timer = window.setInterval(function () {
circle.setAttribute("stroke-dasharray", angle + ", 20000");
circle.setAttribute("stroke", "rgb(255, 255, 255)");
if (angle >= max_angle) {
window.clearInterval(window.timer);
}
angle += angle_increment;
}.bind(this), interval);
setTimeout(removeCirclePartAnimation, 2200);
}
function drawCircle2() {
var circle1 = document.getElementById('green-halo2');
var interval1 = 30;
var angle1 = 0;
var angle_increment1 = 6;
var max_angle1 = 384;
window.timer = window.setInterval(function () {
circle1.setAttribute("stroke-dasharray", angle1 + ", 20000");
circle1.setAttribute("stroke", "rgb(255, 255, 255)");
if (angle1 >= max_angle1) {
window.clearInterval(window.timer);
}
angle1 += angle_increment1;
}.bind(this), interval1);
}
我有另一个类似这个的功能,但是一旦我添加了它,它们就无法正常工作。一旦我禁用了第二个,第一个 setTimeout 就可以很好地处理动画和动作。我该如何解决这个问题?提前致谢。
设置一个window.variable
等同于创建一个全局变量,换句话说:
function AFunction() {
window.timer = 123;
}
与
相同
<script>
var timer = 123;
</script>
(添加脚本标签以显示它不在另一个函数中)
因此,对两个不同的计时器使用 window.timer 意味着您正在重复使用同一个变量,并且它们相互冲突:
var timer;
timer = setInterval(...
timer = setInterval(...
clearInterval(timer);
clearInterval(timer);
将仅清除第二个计时器,因为第一个计时器已经 lost/overwritten。
简单的解决方案是使用两个不同的变量:
var timer1, timer2;
timer1 = setInterval(...
timer2 = setInterval(...
clearInterval(timer1);
clearInterval(timer2);
将清除两个计时器。
另一种方法是使用 let
function drawCircle() {
let timer = window.setInterval(function () {
...
if (angle >= max_angle) {
window.clearInterval(timer);
}
这将在 drawCircle 中限制名为 timer
的变量,因此您在 drawCircle2 中重用 name "timer",它将是一个不同的变量。
我有多个函数使用 window 计时器来创建动画和事件,但是一旦我添加了多个函数,动作就不会像我猜的那样运行,因为 window.timer 重叠
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
viewBox="0 0 200 200" preserveAspectRatio="none" class="circle_svg">
<circle cx="100" cy="100" r="80" id="green-halo" fill="none" stroke="#00CC33" stroke-width="23"
stroke-dasharray="0,20000" transform="rotate(-95,100,100)" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
viewBox="0 0 200 200" preserveAspectRatio="none" class="circle_svg2">
<circle cx="100" cy="100" r="80" id="green-halo2" fill="none" stroke="#00CC33" stroke-width="3"
stroke-dasharray="0,20000" transform="rotate(-95,100,100)" />
</svg>
setTimeout(drawCircle, 1500);
setTimeout(drawCircle2, 1500);
function drawCircle() {
var circle = document.getElementById('green-halo');
var interval = 30;
var angle = 0;
var angle_increment = 6;
var max_angle = 384;
window.timer = window.setInterval(function () {
circle.setAttribute("stroke-dasharray", angle + ", 20000");
circle.setAttribute("stroke", "rgb(255, 255, 255)");
if (angle >= max_angle) {
window.clearInterval(window.timer);
}
angle += angle_increment;
}.bind(this), interval);
setTimeout(removeCirclePartAnimation, 2200);
}
function drawCircle2() {
var circle1 = document.getElementById('green-halo2');
var interval1 = 30;
var angle1 = 0;
var angle_increment1 = 6;
var max_angle1 = 384;
window.timer = window.setInterval(function () {
circle1.setAttribute("stroke-dasharray", angle1 + ", 20000");
circle1.setAttribute("stroke", "rgb(255, 255, 255)");
if (angle1 >= max_angle1) {
window.clearInterval(window.timer);
}
angle1 += angle_increment1;
}.bind(this), interval1);
}
我有另一个类似这个的功能,但是一旦我添加了它,它们就无法正常工作。一旦我禁用了第二个,第一个 setTimeout 就可以很好地处理动画和动作。我该如何解决这个问题?提前致谢。
设置一个window.variable
等同于创建一个全局变量,换句话说:
function AFunction() {
window.timer = 123;
}
与
相同<script>
var timer = 123;
</script>
(添加脚本标签以显示它不在另一个函数中)
因此,对两个不同的计时器使用 window.timer 意味着您正在重复使用同一个变量,并且它们相互冲突:
var timer;
timer = setInterval(...
timer = setInterval(...
clearInterval(timer);
clearInterval(timer);
将仅清除第二个计时器,因为第一个计时器已经 lost/overwritten。
简单的解决方案是使用两个不同的变量:
var timer1, timer2;
timer1 = setInterval(...
timer2 = setInterval(...
clearInterval(timer1);
clearInterval(timer2);
将清除两个计时器。
另一种方法是使用 let
function drawCircle() {
let timer = window.setInterval(function () {
...
if (angle >= max_angle) {
window.clearInterval(timer);
}
这将在 drawCircle 中限制名为 timer
的变量,因此您在 drawCircle2 中重用 name "timer",它将是一个不同的变量。