jQuery: проблема с window.timer с использованием setTimeout и setInterval для нескольких элементов - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть несколько функций, использующих оконный таймер для создания анимации и событий, но как только я добавляю более одной функции, действия не ведут себя так, как я должен догадаться, потому что 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 отлично работает с анимацией и действиями. Как я могу решить это? Заранее спасибо.

1 Ответ

1 голос
/ 06 апреля 2020

Установка window.variable - это то же самое, что создание глобальной переменной, другими словами:

function AFunction() {
    window.timer = 123;
}

- это то же самое, что и

<script>
    var timer = 123;
</script>

(тег сценария добавлен, чтобы показать, что не внутри другой функции)

Таким образом, использование window.timer для двух разных таймеров означает, что вы повторно используете одну и ту же переменную и они конфликтуют друг с другом:

var timer;

timer = setInterval(...
timer = setInterval(...

clearInterval(timer);
clearInterval(timer);

очистит только второй таймер так как первая была потеряна / перезаписана.

Простое решение - использовать две разные переменные:

var timer1, timer2;

timer1 = setInterval(...
timer2 = setInterval(...

clearInterval(timer1);
clearInterval(timer2);

очистит оба таймера.


An альтернативой является использование let

function drawCircle() {
    let timer = window.setInterval(function () {
        ...

    if (angle >= max_angle) {
        window.clearInterval(timer);
    }

, что ограничит переменную с именем timer внутри drawCircle, поэтому вы повторно используете name «timer» в drawCircle2, и это будет другой переменная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...