[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

/resources/lib/jquery/ -> jquery.ba-throttle-debounce.js (source)

   1  /*!
   2   * jQuery throttle / debounce - v1.1 - 3/7/2010
   3   * http://benalman.com/projects/jquery-throttle-debounce-plugin/
   4   * 
   5   * Copyright (c) 2010 "Cowboy" Ben Alman
   6   * Dual licensed under the MIT and GPL licenses.
   7   * http://benalman.com/about/license/
   8   */
   9  
  10  // Script: jQuery throttle / debounce: Sometimes, less is more!
  11  //
  12  // *Version: 1.1, Last updated: 3/7/2010*
  13  // 
  14  // Project Home - http://benalman.com/projects/jquery-throttle-debounce-plugin/
  15  // GitHub       - http://github.com/cowboy/jquery-throttle-debounce/
  16  // Source       - http://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.js
  17  // (Minified)   - http://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.min.js (0.7kb)
  18  // 
  19  // About: License
  20  // 
  21  // Copyright (c) 2010 "Cowboy" Ben Alman,
  22  // Dual licensed under the MIT and GPL licenses.
  23  // http://benalman.com/about/license/
  24  // 
  25  // About: Examples
  26  // 
  27  // These working examples, complete with fully commented code, illustrate a few
  28  // ways in which this plugin can be used.
  29  // 
  30  // Throttle - http://benalman.com/code/projects/jquery-throttle-debounce/examples/throttle/
  31  // Debounce - http://benalman.com/code/projects/jquery-throttle-debounce/examples/debounce/
  32  // 
  33  // About: Support and Testing
  34  // 
  35  // Information about what version or versions of jQuery this plugin has been
  36  // tested with, what browsers it has been tested in, and where the unit tests
  37  // reside (so you can test it yourself).
  38  // 
  39  // jQuery Versions - none, 1.3.2, 1.4.2
  40  // Browsers Tested - Internet Explorer 6-8, Firefox 2-3.6, Safari 3-4, Chrome 4-5, Opera 9.6-10.1.
  41  // Unit Tests      - http://benalman.com/code/projects/jquery-throttle-debounce/unit/
  42  // 
  43  // About: Release History
  44  // 
  45  // 1.1 - (3/7/2010) Fixed a bug in <jQuery.throttle> where trailing callbacks
  46  //       executed later than they should. Reworked a fair amount of internal
  47  //       logic as well.
  48  // 1.0 - (3/6/2010) Initial release as a stand-alone project. Migrated over
  49  //       from jquery-misc repo v0.4 to jquery-throttle repo v1.0, added the
  50  //       no_trailing throttle parameter and debounce functionality.
  51  // 
  52  // Topic: Note for non-jQuery users
  53  // 
  54  // jQuery isn't actually required for this plugin, because nothing internal
  55  // uses any jQuery methods or properties. jQuery is just used as a namespace
  56  // under which these methods can exist.
  57  // 
  58  // Since jQuery isn't actually required for this plugin, if jQuery doesn't exist
  59  // when this plugin is loaded, the method described below will be created in
  60  // the `Cowboy` namespace. Usage will be exactly the same, but instead of
  61  // $.method() or jQuery.method(), you'll need to use Cowboy.method().
  62  
  63  (function(window,undefined){
  64    '$:nomunge'; // Used by YUI compressor.
  65    
  66    // Since jQuery really isn't required for this plugin, use `jQuery` as the
  67    // namespace only if it already exists, otherwise use the `Cowboy` namespace,
  68    // creating it if necessary.
  69    var $ = window.jQuery || window.Cowboy || ( window.Cowboy = {} ),
  70      
  71      // Internal method reference.
  72      jq_throttle;
  73    
  74    // Method: jQuery.throttle
  75    // 
  76    // Throttle execution of a function. Especially useful for rate limiting
  77    // execution of handlers on events like resize and scroll. If you want to
  78    // rate-limit execution of a function to a single time, see the
  79    // <jQuery.debounce> method.
  80    // 
  81    // In this visualization, | is a throttled-function call and X is the actual
  82    // callback execution:
  83    // 
  84    // > Throttled with `no_trailing` specified as false or unspecified:
  85    // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
  86    // > X    X    X    X    X    X        X    X    X    X    X    X
  87    // > 
  88    // > Throttled with `no_trailing` specified as true:
  89    // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
  90    // > X    X    X    X    X             X    X    X    X    X
  91    // 
  92    // Usage:
  93    // 
  94    // > var throttled = jQuery.throttle( delay, [ no_trailing, ] callback );
  95    // > 
  96    // > jQuery('selector').bind( 'someevent', throttled );
  97    // > jQuery('selector').unbind( 'someevent', throttled );
  98    // 
  99    // This also works in jQuery 1.4+:
 100    // 
 101    // > jQuery('selector').bind( 'someevent', jQuery.throttle( delay, [ no_trailing, ] callback ) );
 102    // > jQuery('selector').unbind( 'someevent', callback );
 103    // 
 104    // Arguments:
 105    // 
 106    //  delay - (Number) A zero-or-greater delay in milliseconds. For event
 107    //    callbacks, values around 100 or 250 (or even higher) are most useful.
 108    //  no_trailing - (Boolean) Optional, defaults to false. If no_trailing is
 109    //    true, callback will only execute every `delay` milliseconds while the
 110    //    throttled-function is being called. If no_trailing is false or
 111    //    unspecified, callback will be executed one final time after the last
 112    //    throttled-function call. (After the throttled-function has not been
 113    //    called for `delay` milliseconds, the internal counter is reset)
 114    //  callback - (Function) A function to be executed after delay milliseconds.
 115    //    The `this` context and all arguments are passed through, as-is, to
 116    //    `callback` when the throttled-function is executed.
 117    // 
 118    // Returns:
 119    // 
 120    //  (Function) A new, throttled, function.
 121    
 122    $.throttle = jq_throttle = function( delay, no_trailing, callback, debounce_mode ) {
 123      // After wrapper has stopped being called, this timeout ensures that
 124      // `callback` is executed at the proper times in `throttle` and `end`
 125      // debounce modes.
 126      var timeout_id,
 127        
 128        // Keep track of the last time `callback` was executed.
 129        last_exec = 0;
 130      
 131      // `no_trailing` defaults to falsy.
 132      if ( typeof no_trailing !== 'boolean' ) {
 133        debounce_mode = callback;
 134        callback = no_trailing;
 135        no_trailing = undefined;
 136      }
 137      
 138      // The `wrapper` function encapsulates all of the throttling / debouncing
 139      // functionality and when executed will limit the rate at which `callback`
 140      // is executed.
 141      function wrapper() {
 142        var that = this,
 143          elapsed = +new Date() - last_exec,
 144          args = arguments;
 145        
 146        // Execute `callback` and update the `last_exec` timestamp.
 147        function exec() {
 148          last_exec = +new Date();
 149          callback.apply( that, args );
 150        };
 151        
 152        // If `debounce_mode` is true (at_begin) this is used to clear the flag
 153        // to allow future `callback` executions.
 154        function clear() {
 155          timeout_id = undefined;
 156        };
 157        
 158        if ( debounce_mode && !timeout_id ) {
 159          // Since `wrapper` is being called for the first time and
 160          // `debounce_mode` is true (at_begin), execute `callback`.
 161          exec();
 162        }
 163        
 164        // Clear any existing timeout.
 165        timeout_id && clearTimeout( timeout_id );
 166        
 167        if ( debounce_mode === undefined && elapsed > delay ) {
 168          // In throttle mode, if `delay` time has been exceeded, execute
 169          // `callback`.
 170          exec();
 171          
 172        } else if ( no_trailing !== true ) {
 173          // In trailing throttle mode, since `delay` time has not been
 174          // exceeded, schedule `callback` to execute `delay` ms after most
 175          // recent execution.
 176          // 
 177          // If `debounce_mode` is true (at_begin), schedule `clear` to execute
 178          // after `delay` ms.
 179          // 
 180          // If `debounce_mode` is false (at end), schedule `callback` to
 181          // execute after `delay` ms.
 182          timeout_id = setTimeout( debounce_mode ? clear : exec, debounce_mode === undefined ? delay - elapsed : delay );
 183        }
 184      };
 185      
 186      // Set the guid of `wrapper` function to the same of original callback, so
 187      // it can be removed in jQuery 1.4+ .unbind or .die by using the original
 188      // callback as a reference.
 189      if ( $.guid ) {
 190        wrapper.guid = callback.guid = callback.guid || $.guid++;
 191      }
 192      
 193      // Return the wrapper function.
 194      return wrapper;
 195    };
 196    
 197    // Method: jQuery.debounce
 198    // 
 199    // Debounce execution of a function. Debouncing, unlike throttling,
 200    // guarantees that a function is only executed a single time, either at the
 201    // very beginning of a series of calls, or at the very end. If you want to
 202    // simply rate-limit execution of a function, see the <jQuery.throttle>
 203    // method.
 204    // 
 205    // In this visualization, | is a debounced-function call and X is the actual
 206    // callback execution:
 207    // 
 208    // > Debounced with `at_begin` specified as false or unspecified:
 209    // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
 210    // >                          X                                 X
 211    // > 
 212    // > Debounced with `at_begin` specified as true:
 213    // > ||||||||||||||||||||||||| (pause) |||||||||||||||||||||||||
 214    // > X                                 X
 215    // 
 216    // Usage:
 217    // 
 218    // > var debounced = jQuery.debounce( delay, [ at_begin, ] callback );
 219    // > 
 220    // > jQuery('selector').bind( 'someevent', debounced );
 221    // > jQuery('selector').unbind( 'someevent', debounced );
 222    // 
 223    // This also works in jQuery 1.4+:
 224    // 
 225    // > jQuery('selector').bind( 'someevent', jQuery.debounce( delay, [ at_begin, ] callback ) );
 226    // > jQuery('selector').unbind( 'someevent', callback );
 227    // 
 228    // Arguments:
 229    // 
 230    //  delay - (Number) A zero-or-greater delay in milliseconds. For event
 231    //    callbacks, values around 100 or 250 (or even higher) are most useful.
 232    //  at_begin - (Boolean) Optional, defaults to false. If at_begin is false or
 233    //    unspecified, callback will only be executed `delay` milliseconds after
 234    //    the last debounced-function call. If at_begin is true, callback will be
 235    //    executed only at the first debounced-function call. (After the
 236    //    throttled-function has not been called for `delay` milliseconds, the
 237    //    internal counter is reset)
 238    //  callback - (Function) A function to be executed after delay milliseconds.
 239    //    The `this` context and all arguments are passed through, as-is, to
 240    //    `callback` when the debounced-function is executed.
 241    // 
 242    // Returns:
 243    // 
 244    //  (Function) A new, debounced, function.
 245    
 246    $.debounce = function( delay, at_begin, callback ) {
 247      return callback === undefined
 248        ? jq_throttle( delay, at_begin, false )
 249        : jq_throttle( delay, callback, at_begin !== false );
 250    };
 251    
 252  })(this);


Generated: Fri Nov 28 14:03:12 2014 Cross-referenced by PHPXref 0.7.1