PageSourceSearch

https://www.gearbooker.com/en/js/animateNumber/jquery.animateNumber.js

js gearbooker.com collected 2026-09-24 11:56:19 UTC 5,430 bytes, 175 lines download raw bytes

1/** @preserve jQuery animateNumber plugin v0.0.14
2 * (c) 2013, Alexandr Borisov.
3 * https://github.com/aishek/jquery-animateNumber
4 */
5
6// ['...'] notation using to avoid names minification by Google Closure Compiler
7(function($) {
8  var reverse = function(value) {
9    return value.split('').reverse().join('');
10  };
11
12  var defaults = {
13    numberStep: function(now, tween) {
14      var floored_number = Math.floor(now),
15          target = $(tween.elem);
16
17      target.text(floored_number);
18    }
19  };
20
21  var handle = function( tween ) {
22    var elem = tween.elem;
23    if ( elem.nodeType && elem.parentNode ) {
24      var handler = elem._animateNumberSetter;
25      if (!handler) {
26        handler = defaults.numberStep;
27      }
28      handler(tween.now, tween);
29    }
30  };
31
32  if (!$.Tween || !$.Tween.propHooks) {
33    $.fx.step.number = handle;
34  } else {
35    $.Tween.propHooks.number = {
36      set: handle
37    };
38  }
39
40  var extract_number_parts = function(separated_number, group_length) {
41    var numbers = separated_number.split('').reverse(),
42        number_parts = [],
43        current_number_part,
44        current_index,
45        q;
46
47    for(var i = 0, l = Math.ceil(separated_number.length / group_length); i < l; i++) {
48      current_number_part = '';
49      for(q = 0; q < group_length; q++) {
50        current_index = i * group_length + q;
51        if (current_index === separated_number.length) {
52          break;
53        }
54
55        current_number_part = current_number_part + numbers[current_index];
56      }
57      number_parts.push(current_number_part);
58    }
59
60    return number_parts;
61  };
62
63  var remove_precending_zeros = function(number_parts) {
64    var last_index = number_parts.length - 1,
65        last = reverse(number_parts[last_index]);
66
67    number_parts[last_index] = reverse(parseInt(last, 10).toString());
68    return number_parts;
69  };
70
71  $.animateNumber = {
72    numberStepFactories: {
73      /**
74       * Creates numberStep handler, which appends string to floored animated number on each step.
75       *
76       * @example
77       * // will animate to 100 with "1 %", "2 %", "3 %", ...
78       * $('#someid').animateNumber({
79       *   number: 100,
80       *   numberStep: $.animateNumber.numberStepFactories.append(' %')
81       * });
82       *
83       * @params {String} suffix string to append to animated number
84       * @returns {Function} numberStep-compatible function for use in animateNumber's parameters
85       */
86      append: function(suffix) {
87        return function(now, tween) {
88          var floored_number = Math.floor(now),
89              target = $(tween.elem);
90
91          target.prop('number', now).text(floored_number + suffix);
92        };
93      },
94
95      /**
96       * Creates numberStep handler, which format floored numbers by separating them to groups.
97       *
98       * @example
99       * // will animate with 1 ... 217,980 ... 95,217,980 ... 7,095,217,980
100       * $('#world-population').animateNumber({
101       *    number: 7095217980,
102       *    numberStep: $.animateNumber.numberStepFactories.separator(',')
103       * });
104       * @example
105       * // will animate with 1% ... 217,980% ... 95,217,980% ... 7,095,217,980%
106       * $('#salesIncrease').animateNumber({
107       *   number: 7095217980,
108       *   numberStep: $.animateNumber.numberStepFactories.separator(',', 3, '%')
109       * });
110       *
111       * @params {String} [separator=' '] string to separate number groups
112       * @params {String} [group_length=3] number group length
113       * @params {String} [suffix=''] suffix to append to number
114       * @returns {Function} numberStep-compatible function for use in animateNumber's parameters
115       */
116      separator: function(prefix, separator, group_length, suffix) {
117        separator = separator || ' ';
118        group_length = group_length || 3;
119        suffix = suffix || '';
120        prefix = prefix || '';
121
122        return function(now, tween) {
123          var negative = now < 0,
124              floored_number = Math.floor((negative ? -1 : 1) * now),
125              separated_number = floored_number.toString(),
126              target = $(tween.elem);
127
128          if (separated_number.length > group_length) {
129            var number_parts = extract_number_parts(separated_number, group_length);
130
131            separated_number = remove_precending_zeros(number_parts).join(separator);
132            separated_number = reverse(separated_number);
133          }
134
135          target.prop('number', now).text(prefix + (negative ? '-' : '') + separated_number + suffix);
136        };
137      }
138    }
139  };
140
141  $.fn.animateNumber = function() {
142    var options = arguments[0],
143        settings = $.extend({}, defaults, options),
144
145        target = $(this),
146        args = [settings];
147
148    for(var i = 1, l = arguments.length; i < l; i++) {
149      args.push(arguments[i]);
150    }
151
152    // needs of custom step function usage
153    if (options.numberStep) {
154      // assigns custom step functions
155      var items = this.each(function(){
156        this._animateNumberSetter = options.numberStep;
157      });
158
159      // cleanup of custom step functions after animation
160      var generic_complete = settings.complete;
161      settings.complete = function() {
162        items.each(function(){
163          delete this._animateNumberSetter;
164        });
165
166        if ( generic_complete ) {
167          generic_complete.apply(this, arguments);
168        }
169      };
170    }
171
172    return target.animate.apply(target, args);
173  };
174
175}(jQuery));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.