http://updates.html5rocks.com/2012/05/requestAnimationFrame-API-now-with-sub-millisecond-precision告诉我,最近(Chrome 20)requestAnimationFrame获得了一个新的亚毫秒精度计时器,我必须更新我的代码才能支持它。
环顾各种各样的polyfills,他们似乎都在这个更新之前。它们是否具有某种功能(我不这么认为),或者根本没有最新的可用功能?我应该自己做这个时间(看起来有点浪费)。
答案 0 :(得分:3)
我刚读过那篇文章,很想自己尝试一下。我已经尝试在不支持高分辨率计时器的浏览器中为rAF回调添加包装器。它使用Paul Irish的原始polyfill,增加了以下几行:
var hasPerformance = !!(window.performance && window.performance.now);
// Add new wrapper for browsers that don't have performance
if (!hasPerformance) {
// Store reference to existing rAF and initial startTime
var rAF = window.requestAnimationFrame,
startTime = +new Date;
// Override window rAF to include wrapped callback
window.requestAnimationFrame = function (callback, element) {
// Wrap the given callback to pass in performance timestamp
var wrapped = function (timestamp) {
// Get performance-style timestamp
var performanceTimestamp = (timestamp < 1e12)
? timestamp
: timestamp - startTime;
return callback(performanceTimestamp);
};
// Call original rAF with wrapped callback
rAF(wrapped, element);
}
}
以下是所有组合在一起的要点以及使用新代码的更新示例:
https://gist.github.com/4078614
http://jsfiddle.net/timhall/XQpzU/4351/
此方法旨在将传递回调函数的参数规范化为高分辨率计时器格式。您可以使用类似的方法,恰好相反,如果您有现有的代码期望,将高分辨率计时器转换为旧格式,但我将其视为回归。
我将在我正在进行的一个项目中尝试一下,如果我发现任何问题/改进,我会更新要点。
答案 1 :(得分:2)
高分辨率计时的更改仅影响回调的参数。我不相信任何polyfill明确引用参数,它只取决于你如何使用它。因此,polyfills不需要更新,并且应该已经正常工作 - 只需要注意如何将参数用于RAF回调,如果不这样做,则无需担心!
答案 2 :(得分:1)
这可能有效。修改了这个要点
https://gist.github.com/1579671
(function() {
var lastTime = 0;
var startTime = Date().getTime();
var vendors = ['ms', 'moz', 'webkit', 'o'];
for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame']
|| window[vendors[x]+'CancelRequestAnimationFrame'];
}
if (!window.requestAnimationFrame)
window.requestAnimationFrame = function(callback, element) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
var id = window.setTimeout(function() { callback(currTime - startTime); },
timeToCall);
lastTime = currTime + timeToCall;
return id;
};
if (!window.cancelAnimationFrame)
window.cancelAnimationFrame = function(id) {
clearTimeout(id);
};
}());
获取闭包首次执行时的时间戳(页面加载),然后将回调传递给当前时间戳和原始时间戳之间的差异。应该给你一个等价的新方法。不那么精确,但比完全不同的价值更好。
答案 3 :(得分:1)
以下是Paul Irish的博客文章,其中包含原始的polyfil及其更新。
http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/
这应该足以满足大多数情况。
答案 4 :(得分:-2)
保罗爱尔兰为此提出了一种填充物。
window.requestAminFrame = (function(){
return window.requestAminFrame || window.webkitRequestAnimFrame || window.mozRequestAnimFrame || window.msRequestAnimFrame || window.oRequestAnimFrame || function(func){return setTimeout(func,1/60);};
})();