2016-03-07 379 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/