2016-03-07 378 views
0

我正在嘗試將視頻添加到Fabric.js,我完成了。如何停止/取消Fabric.js中的requestAnimFrame()

但有一個問題:

如何停止或取消requestAnimFrame()

實施例:

var canvas = new fabric.Canvas('c'); 
var videoEl = document.getElementById('video'); 
var video = new fabric.Image(videoEl); 

canvas.add(video); 
video.getElement().play(); 

fabric.util.requestAnimFrame(function render() { 
    canvas.renderAll(); 
    fabric.util.requestAnimFrame(render); 

    var current_time = videoEl.currentTime; 
    if(current_time >= 5) { 
    videoEl.pause(); 
    console.log(current_time); 
    } 

}); 

https://jsfiddle.net/l2aelba/kro7h6rv/

這是後5秒的視頻將停止。我將停止/取消requestAnimFrame

導致高CPU負載

+0

包裝你'requestAnimFrame'通話在'if(flag)'('render'裏面的那個'',因爲第一個將會把它的執行推到th e下一幀,如果你想立即執行'render',那麼它並不是真的需要。) – Kaiido

回答

1

我現在:cancelRequestAnimFrame()

window.cancelRequestAnimFrame = (function(){ 
    return window.cancelAnimationFrame || 
      window.webkitCancelRequestAnimationFrame || 
      window.mozCancelRequestAnimationFrame || 
      window.oCancelRequestAnimationFrame || 
      window.msCancelRequestAnimationFrame || 
      clearTimeout 
})(); 

var canvas = new fabric.Canvas('c'); 
var videoEl = document.getElementById('video'); 
var video = new fabric.Image(videoEl); 

canvas.add(video); 
video.getElement().play(); 

var request; 
var render = function() { 
    canvas.renderAll(); 
    request = fabric.util.requestAnimFrame(render); 
    var current_time = videoEl.currentTime; 
    if(current_time >= 5) { 
     videoEl.pause(); 
     cancelRequestAnimFrame(request); <--- This 
    } 
} 

videoEl.play(); 
fabric.util.requestAnimFrame(render); 

演示:https://jsfiddle.net/l2aelba/kro7h6rv/2/