3 * Function that escapes spaces in event names. This is needed because
4 * "_delayedBind-foo bar-1000" refers to two events
6 function encodeEvent( event
) {
7 return event
.replace( /-/g, '--' ).replace( / /g
, '-' );
12 * Bind a callback to an event in a delayed fashion.
13 * In detail, this means that the callback will be called a certain
14 * time after the event fires, but the timer is reset every time
16 * @param timeout Number of milliseconds to wait
17 * @param event Name of the event (string)
18 * @param data Data to pass to the event handler (optional)
19 * @param callback Function to call
21 delayedBind: function( timeout
, event
, data
, callback
) {
22 if ( arguments
.length
== 3 ) {
23 // Shift optional parameter down
27 var encEvent
= encodeEvent( event
);
28 return this.each( function() {
31 // Do this only once for every (event, timeout) pair
32 if ( !( $(this).data( '_delayedBindBound-' + encEvent
+ '-' + timeout
) ) ) {
33 $(this).data( '_delayedBindBound-' + encEvent
+ '-' + timeout
, true );
34 $(this).bind( event
, function() {
35 var timerID
= $(this).data( '_delayedBindTimerID-' + encEvent
+ '-' + timeout
);
36 // Cancel the running timer
37 if ( typeof timerID
!= 'undefined' )
38 clearTimeout( timerID
);
39 timerID
= setTimeout( function() {
40 $(that
).trigger( '_delayedBind-' + encEvent
+ '-' + timeout
);
42 $(this).data( '_delayedBindTimerID-' + encEvent
+ '-' + timeout
, timerID
);
47 $(this).bind( '_delayedBind-' + encEvent
+ '-' + timeout
, data
, callback
);
52 * Cancel the timers for delayed events on the selected elements.
54 delayedBindCancel: function( timeout
, event
) {
55 var encEvent
= encodeEvent( event
);
56 return this.each( function() {
57 var timerID
= $(this).data( '_delayedBindTimerID-' + encEvent
+ '-' + timeout
);
58 if ( typeof timerID
!= 'undefined' )
59 clearTimeout( timerID
);
64 * Unbind an event bound with delayedBind()
66 delayedBindUnbind: function( timeout
, event
, callback
) {
67 var encEvent
= encodeEvent( event
);
68 return this.each( function() {
69 $(this).unbind( '_delayedBind-' + encEvent
+ '-' + timeout
, callback
);