| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | (function($) {  var NumberProgressBar = function(element, options) {    var settings = $.extend ({      duration: 10000,      percentage: 0,      shownQuery: '.number-pb-shown',      numQuery: '.number-pb-num',    }, options || {});    this.duration = settings.duration;    this.last_percentage = -1;    this.percentage = (settings.percentage >= 0 && settings.percentage <= 100) ? settings.percentage : 0;    this.$element = $(element);    this.width = this.$element.width();    this.$shownBar = this.$element.find(settings.shownQuery);    this.$num = this.$element.find(settings.numQuery);		this.$progressFunction = settings.progressFunction;    this.reach(this.percentage);  }  NumberProgressBar.prototype.reach = function(percentage) {    if (this.last_percentage < 0) {      this.last_percentage = 0;    } else {      this.last_percentage = this.percentage;    }    if (percentage < 0) {      this.percentage = 0;    } else if (percentage > 100) {      this.percentage = 100;    } else {      this.percentage = percentage;    }    //console.log('reach: ', this.last_percentage, this.percentage, this.calDuration());    this.moveShown();    this.moveNum();  }  NumberProgressBar.prototype.calDuration = function() {    return this.duration * Math.abs(this.percentage - this.last_percentage) / 100.0;  }  NumberProgressBar.prototype.moveShown = function() {    //console.log('moveShown: ', this.percentage);    this.$shownBar.velocity({      width: this.percentage + '%'    }, {      duration: this.calDuration()    })  }  NumberProgressBar.prototype.moveNum = function() {    //console.log('moveNum: ', this.percentage);    var self = this;    var left = this.width * this.percentage / 100.0;    var numWidth = this.$num.width();    if (numWidth + left > this.width) {      var percentage = (this.width - numWidth) / this.width * 100.0;    } else {      var percentage = this.percentage;    }    this.$num.velocity({      left: percentage + '%'    }, {      duration: this.calDuration()    })    // number    $({num: parseInt(this.$num.text())}).animate({      num: this.percentage    }, {      queue: true,      duration: self.calDuration(),      step: function() {        self.$num.text(Math.ceil(this.num) + '%');				self.$progressFunction(this.num)      },      complete: function() {        self.$num.text(self.percentage + '%');				self.$progressFunction(this.num)      }    })  }  $.fn.NumberProgressBar = function(options) {    return this.each(function () {      var element = $(this);      if (element.data('number-pb')) return;      element.data('number-pb', new NumberProgressBar(this, options));    })  }  $.fn.reach = function(percentage) {    return this.each(function() {      var element = $(this);      var progressbar = element.data('number-pb');      if (!progressbar) return;      if (percentage < 0 || percentage > 100 || percentage == progressbar.percentage) return;      progressbar.reach(percentage);    })  }})(jQuery);
 |