仅在动画一完成后,如何运行动画二?

时间:2019-11-04 21:07:43

标签: javascript

我知道这个问题已经回答了,但是大多数都在jquery中。目前,功能一和功能二同时运行。但是,如何更改此代码,使功能二仅在功能一完成其到达屏幕顶部并再次向下移动的行程后才运行?

<html>
<head>
  <title>JavaScript Animation</title>
</head>
<body>
  <script>
    function start() {
      animation();
      animationone();
    }
    function animation() {
      obj = document.getElementById("jbtext");
      obj.style.position = "absolute";
      obj.style.bottom = "0px";
      w = document.body.clientHeight;
      goUp = true;
      animateText();
    }
    var obj, w, goUp;
    function animateText() {
      var pos = parseInt(obj.style.bottom, 10);
      (goUp) ? pos++ : pos--;
      obj.style.bottom = pos + "px";
      if (pos < 0) {
        goUp = true;
      }
      if (pos > w) {
        goUp = false;
      }
      if (pos < 0) {
        return;
      }
      setTimeout(animateText, 10);
    }
    document.addEventListener("DOMContentLoaded", start, false);
    function animationone() {
      obja = document.getElementById("jbtexta");
      obja.style.position = "absolute";
      obja.style.left = "10px";
      obja.style.bottom = "10px";
      wtwo = document.body.clientWidth;
      goRight = true;
      animatesecond();
    }
    var obja, wtwo, goRight;
    function animatesecond() {
      var position = parseInt(obja.style.left, 10);
      (goRight) ? position++ : position--;
      obja.style.left = position + "px";
      if (position > wtwo) {
        goRight = false;
      }
      if (position < 0) {
        goRight = true;
      }
      if (position < 0) {
        return;
      }
      setTimeout(animatesecond, 10);
    }
  </script>
  <p id="jbtext"> first function</p>
  <p id="jbtexta"> second function</p>
</body>
</html>

3 个答案:

答案 0 :(得分:1)

您可以在JavaScript中使用Promise。承诺是将异步运行并在稍后的时间点返回的代码块。通过调用resolve方法(它是Promise构造函数的一个参数)来“返回”。然后,您可以将诺言链接在一起以完成所需的内容。

function animationOne() {
    return new Promise(function(resolve) {
        // ... do your logic for the first animation here here.

        resolve(); // <-- call this when your animation is finished.
    })
}

function animationTwo() {
    return new Promise(function(resolve) {
        // ... do your logic for animation two here.

        resolve(); // <-- call this when your animation is finished.
    })
}

animationOne().then(function() {
    animationTwo();
})

答案 1 :(得分:0)

这只是Peter LaBanca回答的另一种方式。

我不喜欢使用Promises。相反,我使用asyncawait

function runFirst() {
  //animation
}
async function waitThenRun() {
  await runFirst();
  //second animation
}
waitThenRun();

我只是不喜欢Promise的想法。上面的代码运行waitThenRun()。然后,该函数运行runFirst(),但要等到它完成运行其余部分后,再运行。在setTimeout中使用runFirst或其他延迟代码的方式意味着您应该使用Promise。 (纯JS)

MDN

答案 2 :(得分:0)

以下脚本AnimationOneAndTwo怎么样?该脚本使用setInterval来“运行”动画。要使用它,请使用工厂方法createInstance创建一个实例。然后,当结束第一个动画的条件为真时,调用实例的下一个方法以启动第二个动画。然后,当结束第二个动画的条件为真时,请调用实例的end方法。以下代码片段包含AnimationOneAndTwo的定义及其在您所处情况中的应用。有关如何创建函数的更多详细信息,请参阅“ How to Run One Animation after Another: A Reply to a Question at Stack Overflow”。

<html>
<head>
  <title>JavaScript Animation</title>
</head>
<body>
  <script>
/***
 * AnimationOneAndTwo
 * Copyright 2019 John Frederick Chionglo (jfchionglo@yahoo.ca)
 ***/
function AnimationOneAndTwo(parms) {
  this.id = parms.id;
}
AnimationOneAndTwo.objs = [];
AnimationOneAndTwo.createProcessLogic = function(parms) {
  var obj;
  obj = new AnimationOneAndTwo({id: parms.id});
  AnimationOneAndTwo.objs[parms.id] = obj;
  if ("animationStepOne" in parms) {}
  else {
    throw new RangeError("animationStepOne not found in parms.");
  }
  obj["animationStepOne"] = parms.animationStepOne;
  if ("animationStepTwo" in parms) {}
  else {
    throw new RangeError("animationStepTwo not found in parms.");
  }
  obj["animationStepTwo"] = parms.animationStepTwo;
  if ("speed" in parms) {
    obj.msf_0 = parms.speed;
  }
  return obj;
};
with (AnimationOneAndTwo) {
  prototype.ap = window;
  prototype.dc = window.document;
  prototype.np = 6;
  prototype.nt = 4;
  prototype.ni = 7;
  prototype.no = 3;
  prototype.nn = 1;
  prototype.nr = 1;  (function(ia, pa) {
    var str, j;
    for (j=0; j<ia.length; j++) {
      str = '  prototype.' + 'iE_in_' + ia[j] + ' = function() {\n';
      str +=  '  this.s_in_' + ia[j] + ' = ( this.m_' + pa[j] + ' < 1 ? true : false );\n';
      str += '};\n';
      eval(str);
    }
  })([1], [0]);
  (function(ia, pa) {
    var str, j;
    for (j=0; j<ia.length; j++) {
      str = '  prototype.' + 'iE_in_' + ia[j] + ' = function() {\n';
      str +=  '  this.s_in_' + ia[j] + ' = ( this.m_' + pa[j] + ' < 1 ? false : true );\n';
      str += '};\n';
      eval(str);
    }
  })([0,2,3,4,5,6], [0,2,0,2,5,4]);
  (function(ia, pa) {
    var str, j;
    for (j=0; j<ia.length; j++) {
      str = '  prototype.' + 'fE_in_' + ia[j] + ' = function() {\n';
      str +=  '  this.m_' + pa[j] + ' -= 1;\n';
      str += '};\n';
      eval(str);
    }
  })([3,4,5,6], [0,2,5,4]);
  (function(oa, pa, ka) {
    var str, j;
    for (j=0; j<oa.length; j++) {
      str = '  prototype.' + 'fE_ou_' + oa[j] + ' = function() {\n';
      str +=  '  this.m_' + pa[j] + ' += 1;\n';
      str += '};\n';
      eval(str);
    }
  })([0,1,2], [1,3,2]);
  (function(ta, ia) {
    var str, j, k, h;
    for (j=0; j<ta.length; j++) {
      str = '  prototype.' + 'iE_T_' + ta[j] + ' = function() {\n';
        for (h=0; h<ia[j].length; h++) {
          k = ia[j][h];
          str += '  this.iE_in_' + k + '();\n';
        }
        if (ia[j].length<1) {
          str += '  this.s_t_' + ta[j] + ' = true;\n';
        } else {
          str += '  this.s_t_' + ta[j] + ' = this.s_in_' + ia[j][0];
          for (k=1; k<ia[j].length; k++)
            str += ' && this.s_in_' + ia[j][k];
        }
        str += ';\n';
      str += '};\n';
      eval(str);
    }
  })([0,1,2,3], [[0], [1, 2], [3, 6], [4, 5]]);
  (function(ta, ia, oa) {
    var str, j, k, h;
    for (j=0; j<ta.length; j++) {
      str = '  prototype.' + 'fE_T_' + ta[j] + ' = function() {\n';
        for (h=0; h<ia[j].length; h++) {
          k = ia[j][h];
          str += '  this.fE_in_' + k + '();\n';
        }
        for (h=0; h<oa[j].length; h++) {
          k = oa[j][h];
          str += '  this.fE_ou_' + k + '();\n';
        }
      str += '};\n';
      eval(str);
    }
  })([0,1,2,3], [[], [], [3, 6], [4, 5]], [[], [], [2], []]);
  (function(parms) {
    var str, j, k, h, i;
    var ta = parms.ta;
    var pad = parms.pad;
    var pat = parms.pat;
    var tar = parms.tar;
    var tad = parms.tad;
    var tav = parms.tav;
    for (i=0; i<ta.length; i++) {
      j = ta[i];
      str = '  prototype.' + ' pEv_T_' + j + ' = function() {\n';
      str += '    this.fE_T_' + j + '();\n';
      for (h=0; h<tar[j].length; h++) {
        k = tar[j][h];
        str += '    this.iE_T_' + k + '();\n';
      }
      str += '  };\n';
      eval(str);
    }
  })({
     ta: [0,1,2,3],
    tar: [[0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3], [1, 3]]
  });
  prototype.pEv_T_0 = function() {
    this.fE_T_0();
    this.iE_T_0();
    this.iE_T_1();
    this.iE_T_2();
    this.animationStepOne();
  };
  prototype.pEv_T_1 = function() {
    this.fE_T_1();
    this.iE_T_0();
    this.iE_T_1();
    this.iE_T_2();
    this.iE_T_3();
    this.animationStepTwo();
  };
  prototype.ipn = function() {
    this.iE_T_0();
    this.iE_T_1();
    this.iE_T_2();
    this.iE_T_3();
  };
  prototype.im = function() {
    var j, h, pa;
    for (j=0; j<this.np; j++) {
      eval('this.m_' + j + ' = 0');
    }
    pa = [1,2,3];
    for (h=0; h<pa.length; h++) {
      j = pa[h];
      eval('this.m_' + j + ' = ' + 0);
    }
    pa = [0,4,5];
    for (h=0; h<pa.length; h++) {
      j = pa[h];
      eval('this.m_' + j + ' = ' + 1);
    }
  };
  prototype.ai_0 = undefined;
  prototype.msf_0 = 10;
  prototype.mss_0 = 1500;
  prototype.ms_0 =   prototype.msf_0;
  prototype.sp_0 = function() {
    if (this.ai_0) { this.ap.clearInterval(this.ai_0); this.ai_0 = undefined; }
  };
  prototype.st_0 = function() {
    if (this.ai_0) { this.sp_0(); }
    this.ai_0 = this.ap.setInterval('AnimationOneAndTwo.objs[' + this.id + '].rn_0()', this.ms_0);
  };
  prototype.rn_0 = function() {
    var t;
    var et = [];
    if (this.s_t_0) {
        this.pEv_T_0();
    } else if (this.s_t_1) {
        this.pEv_T_1();
    } else {
      if (this.ai_0) {
        this.sp_0();
      }
    }
  };
  prototype.start = function() {
    with (this) {
      if (ai_0) { sp_0(); }
      im();
      ipn();
      st_0();
    }
  };
  prototype.next = function() {
    if (this.s_t_2) {
      this.pEv_T_2();
    } else if (this.s_t_3) {
      this.pEv_T_3();
    }
  };
  prototype.end = function() {
    if (this.s_t_2) {
      this.pEv_T_2();
    }
    if (this.s_t_3) {
      this.pEv_T_3();
    }
  };
}

    var aotobj;
    function start() {
      animation();
      animationone();
      aotobj = AnimationOneAndTwo.createProcessLogic({
        id: 12345
        , animationStepOne: animateText
        , animationStepTwo: animatesecond
      });
      aotobj.start();
    }

    function animation() {
      obj = document.getElementById("jbtext");
      obj.style.position = "absolute";
      obj.style.bottom = "0px";
      w = document.body.clientHeight;
      goUp = true;
//      animateText();
    }
    var obj, w, goUp;
    function animateText() {
      var pos = parseInt(obj.style.bottom, 10);
      (goUp) ? pos++ : pos--;
      obj.style.bottom = pos + "px";
      if (pos < 0) {
        goUp = true;
      }
      if (pos > w) {
        goUp = false;
      }
      if (pos < 0) {
        aotobj.next();
        return;
      }
//      setTimeout(animateText, 10);
    }
    document.addEventListener("DOMContentLoaded", start, false);
    function animationone() {
      obja = document.getElementById("jbtexta");
      obja.style.position = "absolute";
      obja.style.left = "10px";
      obja.style.bottom = "10px";
      wtwo = document.body.clientWidth;
      goRight = true;
//      animatesecond();
    }
    var obja, wtwo, goRight;
    function animatesecond() {
      var position = parseInt(obja.style.left, 10);
      (goRight) ? position++ : position--;
      obja.style.left = position + "px";
      if (position > wtwo) {
        goRight = false;
      }
      if (position < 0) {
        goRight = true;
      }
      if (position < 0) {
//        AnimationOneAndTwo.objs[12345].end();
        aotobj.end();
        return;
      }
//      setTimeout(animatesecond, 10);
    }

  </script>
  <p id="jbtext"> first function</p>
  <p id="jbtexta"> second function</p>
</body>
</html>