const availablePrefixs = ['moz', 'ms', 'webkit'] function requestAnimationFramePolyfill () { let lastTime = 0 return function (callback) { const currTime = new Date().getTime() const timeToCall = Math.max(0, 16 - (currTime - lastTime)) const id = window.setTimeout(function () { callback(currTime + timeToCall) }, timeToCall) lastTime = currTime + timeToCall return id } } export default function getRequestAnimationFrame () { if (typeof window === 'undefined') { return () => {} } if (window.requestAnimationFrame) { // https://github.com/vuejs/vue/issues/4465 return window.requestAnimationFrame.bind(window) } const prefix = availablePrefixs.filter(key => `${key}RequestAnimationFrame` in window)[0] return prefix ? window[`${prefix}RequestAnimationFrame`] : requestAnimationFramePolyfill() } export function cancelRequestAnimationFrame (id) { if (typeof window === 'undefined') { return null } if (window.cancelAnimationFrame) { return window.cancelAnimationFrame(id) } const prefix = availablePrefixs.filter(key => `${key}CancelAnimationFrame` in window || `${key}CancelRequestAnimationFrame` in window, )[0] return prefix ? (window[`${prefix}CancelAnimationFrame`] || window[`${prefix}CancelRequestAnimationFrame`]).call(this, id) : clearTimeout(id) }