我不明白为什么API包含cancelAnimationFrame()
,因为
我可以通过设置continue
变量来停止动画,如下所示:
function draw(timestamp) {
if (continue == true) { requestAnimationFrame(draw); }
}
所以问题是,在什么情况下我应该使用cancelAnimationFrame()?
最佳答案
首先,重要的引用点。一个(过时的)(候选推荐)规范:http://www.w3.org/TR/animation-timing/#definitions
另外,请记住,这些规范的目标受众是用户代理开发人员。在这些规范的实现中,用户代理向我们(应用程序开发人员)提供了一个与之交互的API。
注意上面每个Document 情绪中的;您可以在window
或上下文中包含多个文档。您可以在浏览上下文中具有多个上下文。
因此,这与每个Document 的有什么关系?好,(推荐)规范引用了流程模型,该模型实际上将所有这些列表转储到一个空列表中,并对该“保留”列表的结果执行回调调用算法。身为应用程式开发人员,我们可能不必担心; *我想,我们作为应用程序开发人员将不会在我们自己的window
上下文的多个文档中以及整个文档中跟踪和维护甚至Document.FrameRequestList实例。我们只是与API交互,可以通过window
访问。
现在,让我们总结一下requestAnimationFrame(<function>)
的作用,和的返回结果。
调用requestAnimationFrame
并提供function
作为回调,将条目(<handler,FrameRequestCallback>
或<long, "an object, with a cancelled member, that encapsulates your function">
)添加到动画框架请求回调列表中。 requestAnimationFrame
返回Handler [long]
。
根据上述规范(http://www.w3.org/TR/animation-timing/#dom-windowanimationtiming-cancelanimationframe),
可以推断出,通过调用cancelAnimationFrame
并提供(可能是以前存储的)handle
作为参数,您从动画帧请求回调列表中删除了一项,但不是这种情况。
因此,您在handle
中提供的cancelAnimationFrame
不会修改列表。它将“在回调上”将cancelled标志设置为true ..这实际上使它无法运行。这是合理的,因为前面提到的处理模型。
因此,对于您的问题(以及对您的问题的特定评论),跳过向文档的动画框架请求回调列表添加条目的操作,使用requestAnimationFrame
不会保留现有的scheduled
条目(或现有的条目) (其取消标志为false)运行。需要考虑一个“更大”的上下文和处理模型(其中包括文档页面可见性属性)。
在您的问题中,有人提到作为注释,您可能希望取消特定的场景框架请求,但出于无意的方面和考虑因素,这样做是更好的理由。
简而言之,如果您打算使用API来请求进行回调的框架更新,请使用API取消/停止所述更新请求并停止回调。
关于javascript - 为什么我需要cancelAnimationFrame(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27108333/