退出Safari上的全屏切换空间时,RequestAnimationFrame无法正常工作

时间:2014-06-27 10:38:45

标签: javascript safari fullscreen settimeout requestanimationframe

通过单击原始空间的旅行窗口退出全屏时,请求动画帧停止工作。如果使用转义键取消全屏模式或调用cancelFullScreen(),则一切正常。

重现的步骤:

  • 打开https://dl.dropboxusercontent.com/u/769042/prezi/safari-fullscreen.html
  • 点击"用raf"绘制,出现一个kittie
  • 点击"全屏",全屏
  • 点击"用raf"绘制,出现一个kittie
  • 返回原始野生动物园所在的空间,即显示"点击退出全屏模式",点击任意位置,全屏退出
  • 点击"用raf"画画,没有发生

它的作用就是处理点击呼叫:

window.requestAnimationFrame(draw);

只是在画布上下文中绘制了一些内容:

function draw() {
    ctx.drawImage(img, Math.random()*500|0, Math.random()*400|0, 100, 100);
}

我还检查了.hidden和.visibilityState,它们得到了正确的更新。

在osx 10.9.3,safari 7.0.4(9537.76.4)上测试。

除了切换到旧的setTimeout之外,还有没有任何解决方法/解决方案?

1 个答案:

答案 0 :(得分:1)

这听起来像WebKit Bug 88940

  

使用requestAnimationFrame和全屏API   DrawingArea支持的窗口将导致rAF永久挂起   完全筛选时的动画,因为以下内容:

     
      
  1. JavaScript会导致全屏转换开始。
  2.   
  3. 绘画(和rAF)暂停。
  4.   
  5. 页面更改大小。   一个。 DrawingAreaProxyImpl :: sizeDidChange()调用DrawingAreaImpl :: updateBackingStoreState,调用它们   DrawingAreaImpl :: resumePainting。   湾DrawingAreaImpl :: resumePainting恢复绘画,但恢复rAF,因为windowIsVisible(合法地)是假的。
  6.   
  7. 视图变得可见,windowIsVisible更新为true。
  8.   
  9. visibilityDidChange()再次调用resumePainting,但这次它提前退出,因为绘画没有暂停。
  10.         

    请注意,由于4中的提前退出,rAF永远不会恢复。

基于此描述,我怀疑没有有效的解决方法,因为绘图区域进入调用resumePainting无效的状态。

(感谢Jason Davies发现此错误报告。)