javascript手风琴跟踪时间问题

javascript手风琴跟踪时间问题,javascript,animation,time,accordion,settimeout,Javascript,Animation,Time,Accordion,Settimeout,我正在阅读javascript教程: 基本上,它向您展示了如何使用纯javascript而不是jquery创建手风琴。在跟踪动画的实际部分之前,所有这些对我来说都是有意义的。他说,正因为如此,我们在动画函数中做的第一件事就是计算自上次动画迭代以来经过了多少时间。 然后使用以下代码: 代码: lastTick等于调用函数时的值Date.getTime和curTick等于收到函数时的值。我不明白为什么我们要从另一个中减去一个。我无法想象这两个值之间有任何明显的时间差。也许我错过了什么。是每次单击菜单

我正在阅读javascript教程: 基本上,它向您展示了如何使用纯javascript而不是jquery创建手风琴。在跟踪动画的实际部分之前,所有这些对我来说都是有意义的。他说,正因为如此,我们在动画函数中做的第一件事就是计算自上次动画迭代以来经过了多少时间。 然后使用以下代码: 代码:

lastTick等于调用函数时的值Date.getTime和curTick等于收到函数时的值。我不明白为什么我们要从另一个中减去一个。我无法想象这两个值之间有任何明显的时间差。也许我错过了什么。是每次单击菜单标题时仅调用一次“动画”功能,还是多次调用该功能以创建增量动画效果

setTimeout("animate(" + new Date().getTime() + "," + TimeToSlide + ",'" + openAccordion + "','" + nID + "')", 33); 
谢谢你的回复

lastTick等于调用函数时的值

lastTick等于之前调用函数时动画最后一帧的值。从那时起,该脚本将控制权交还给浏览器,要求在33毫秒内回调

所以curTick lastTick通常会在33左右,但是如果浏览器因为其他事情同时发生而滞后,那么它可能会更高。这就是为什么必须进行时间阅读的原因

更常见的是,在这类代码中,您将动画开始的时间存储在变量中,并使用setInterval经常检查它,而不是每次都设置一个完整的新超时函数,特别是设置字符串的超时,这非常难看

预计到达时间:

然后运行animate函数,该函数传递当前时间

没有。再次查看设置超时调用:

setTimeout("animate(" + new Date().getTime() + ","...
那是一条线。new Date.getTime在超时设置时间计算,而不是在超时调用时间计算。它最终生成一个字符串,如:

setTimeout("animate(1275139344177, 250, 'Accordion4Content', 'Accordion4Content')", 33)
这是最后一帧结束时的时间,而不是触发下一帧超时的时间

将JavaScript代码放在这样的字符串中会非常混乱,到处都是转义问题,通常被认为是非常糟糕的做法。使用内联函数可以更清楚地执行此操作:

var passTick= new Date().getTime();
setTimeout(function() {
    animate(passTick, TimeToSlide, openAccordion, nID);
}, 33);

是的,这是我不明白的前一部分。用户单击标题,调用runAccordion方法,设置一些变量,然后setTimeout函数等待33毫秒,然后运行animate函数,该函数将当前时间Date.getTime作为参数传递给我们称为lastTick。所以我的大脑认为,在用户点击标题后,它会等待33毫秒,然后触发动画。这就是为什么我不明白lastTick可以等于之前调用的函数的值。你是说new Date.getTime首先计算,然后在调用animate之前有33毫秒的时间?如果是这样的话,那么教程对我来说是有意义的。是的,调用getTime,并将数字结果转换为字符串。然后,它在字符串中生成一些代码,包括该数字。由该字符串生成的代码在创建字符串33毫秒后超时触发时执行。用字符串创建代码很糟糕,是吗?
var passTick= new Date().getTime();
setTimeout(function() {
    animate(passTick, TimeToSlide, openAccordion, nID);
}, 33);