我不明白为什么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/

10-11 08:23