diff options
Diffstat (limited to 'resources/jquery/jquery.delayedBind.js')
-rw-r--r-- | resources/jquery/jquery.delayedBind.js | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/resources/jquery/jquery.delayedBind.js b/resources/jquery/jquery.delayedBind.js new file mode 100644 index 00000000..6d972996 --- /dev/null +++ b/resources/jquery/jquery.delayedBind.js @@ -0,0 +1,68 @@ +(function( $ ) { +/** + * Function that escapes spaces in event names. This is needed because + * "_delayedBind-foo bar-1000" refers to two events + */ +function encodeEvent( event ) { + return event.replace( /-/g, '--' ).replace( / /g, '-' ); +} + +$.fn.extend( { + /** + * Bind a callback to an event in a delayed fashion. + * In detail, this means that the callback will be called a certain + * time after the event fires, but the timer is reset every time + * the event fires. + * @param timeout Number of milliseconds to wait + * @param event Name of the event (string) + * @param data Data to pass to the event handler (optional) + * @param callback Function to call + */ + delayedBind: function( timeout, event, data, callback ) { + var encEvent = encodeEvent( event ); + return this.each( function() { + var that = this; + // Bind the top half + // Do this only once for every (event, timeout) pair + if ( !( $(this).data( '_delayedBindBound-' + encEvent + '-' + timeout ) ) ) { + $(this).data( '_delayedBindBound-' + encEvent + '-' + timeout, true ); + $(this).bind( event, function() { + var timerID = $(this).data( '_delayedBindTimerID-' + encEvent + '-' + timeout ); + // Cancel the running timer + if ( typeof timerID != 'undefined' ) + clearTimeout( timerID ); + timerID = setTimeout( function() { + $(that).trigger( '_delayedBind-' + encEvent + '-' + timeout ); + }, timeout ); + $(this).data( '_delayedBindTimerID-' + encEvent + '-' + timeout, timerID ); + } ); + } + + // Bottom half + $(this).bind( '_delayedBind-' + encEvent + '-' + timeout, data, callback ); + } ); + }, + + /** + * Cancel the timers for delayed events on the selected elements. + */ + delayedBindCancel: function( timeout, event ) { + var encEvent = encodeEvent( event ); + return this.each( function() { + var timerID = $(this).data( '_delayedBindTimerID-' + encEvent + '-' + timeout ); + if ( typeof timerID != 'undefined' ) + clearTimeout( timerID ); + } ); + }, + + /** + * Unbind an event bound with delayedBind() + */ + delayedBindUnbind: function( timeout, event, callback ) { + var encEvent = encodeEvent( event ); + return this.each( function() { + $(this).unbind( '_delayedBind-' + encEvent + '-' + timeout, callback ); + } ); + } +} ); +} )( jQuery );
\ No newline at end of file |