javascript - 在最后一次迭代的每个()函数中更改变量值 - jQuery

标签 javascript jquery animation each

这是我的 fiddle link .

所以我会有多个步骤,应该一个接一个地制作动画。为了使它们一个接一个地动画化,我使用了一些 flag 变量。根据其值,相应的步骤应该是动画的。

但是有一个问题 - 它的值在第一步中没有被改变,这就是为什么当你点击 2(从时间轴)时只有第一步被动画化。当我在 each() 函数中一个一个地动画化每个箭头时,问题出在下面的部分,并且 flag 变量值在箭头的最后一次迭代中被更改:

var flag = 0;
function step_1(){
    jQuery(".step_1_nav").addClass('active_bullet_point');
    jQuery(".step_1 .label").addClass('active_label_text');

    var delay = 0;
    jQuery('.step_1 .arrows span').each(function(index) {
        var $this = $(this);
        var total = $('.step_1 .arrows span').length;
        $this.delay(delay).animate({opacity:1}, 100, function(){
            $this.addClass('white_animated_arrow');
            if (index === (total - 1)) {
                jQuery(".step_1 .bullet_point").addClass('active_bullet_point');
                flag = 1;
            }
        });
        delay += 100;
    });
}

jQuery(".step_2_nav").click(function(){
    step_1();
    console.log(flag); /* here flag returns 0 instead of 1 */
    step_2();
});

当我放这部分的时候

if (index === (total - 1)) {
    jQuery(".step_1 .bullet_point").addClass('active_bullet_point');
    flag = 1;
}

out of animate callback function flag 的值被更改为 1 但它立即发生而不等待最后一个箭头的迭代并且所有 2 个步骤都立即被动画化。

我在这里缺少什么?有什么想法吗?

最佳答案

我使用 setInterval()

JS FIDDLE DEMO

var counter_step1 = 0;
var counter_step2 = 0;
var step1Completed = false;
var timeDelay = 400; // set delay time accordingly

function step1() {

  $(".step_1 .label").addClass("active_label_text");
  var arrowCount = $(".arrows_down span").size();
  var myFisrt = setInterval(function() {
    if (counter_step1 < arrowCount) {
      counter_step1++
      $(".arrows_down span:nth-child(" + counter_step1 + ")").addClass("white_animated_arrow");
    } else {
      $(".step_1 .bullet_point").addClass("active_bullet_point");
      step1Completed = true;
      clearInterval(myFisrt);
    }
  }, timeDelay);
}


function step2() {
  var arrowCount = $(".arrows_up span").size();
  var mySecond = setInterval(function() {
    if (step1Completed) {
      $(".step_2 .label").addClass("active_label_text");
      if (arrowCount > counter_step2) {
        $(".arrows_up span:nth-child(" + arrowCount + ")").addClass("white_animated_arrow");
        arrowCount--
      } else {
        $(".step_2 .bullet_point").addClass("active_bullet_point");
        clearInterval(mySecond);
      }
    }
  }, timeDelay);
}

function setAnimation(myVALUE) {
  step1();
  if (myVALUE == "STEP2") { step2();  }
}

$(".step_1_nav").on('click', function() {
  setAnimation("STEP1");
});

$(".step_2_nav").on('click', function() {
  setAnimation("STEP2");
});

关于javascript - 在最后一次迭代的每个()函数中更改变量值 - jQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44840224/

相关文章:

javascript - 悬停时继续 CSS3 关键帧动画/悬停时停止重复

javascript - 如何在页面之间重新初始化自定义js文件(Barba.js)?

javascript - 确定每个表行中具有特定类别的 td 数量

java - 如何在 Java 中将 JavaScript 日期转换为日期?

用于可点击条形图的 Javascript 库?

javascript - 在 XSL 中呈现 JavaScript

javascript - 如何使此弹出窗口仅在单击按钮时加载

jquery - 从 javascript 调用 asp 经典函数时出错

javascript - 使用新 API 重新初始化数据表

ios - 使用按钮停止动画方 block