44 lines
1.0 KiB
JavaScript
44 lines
1.0 KiB
JavaScript
|
window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;
|
||
|
|
||
|
/**
|
||
|
* Handles debouncing of events via requestAnimationFrame
|
||
|
* @see http://www.html5rocks.com/en/tutorials/speed/animations/
|
||
|
* @param {Function} callback The callback to handle whichever event
|
||
|
*/
|
||
|
function Debouncer (callback) {
|
||
|
this.callback = callback;
|
||
|
this.ticking = false;
|
||
|
}
|
||
|
Debouncer.prototype = {
|
||
|
constructor : Debouncer,
|
||
|
|
||
|
/**
|
||
|
* dispatches the event to the supplied callback
|
||
|
* @private
|
||
|
*/
|
||
|
update : function() {
|
||
|
this.callback && this.callback();
|
||
|
this.ticking = false;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* ensures events don't get stacked
|
||
|
* @private
|
||
|
*/
|
||
|
requestTick : function() {
|
||
|
if(!this.ticking) {
|
||
|
requestAnimationFrame(this.rafCallback || (this.rafCallback = this.update.bind(this)));
|
||
|
this.ticking = true;
|
||
|
}
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Attach this as the event listeners
|
||
|
*/
|
||
|
handleEvent : function() {
|
||
|
this.requestTick();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
module.exports = Debouncer
|