/** * jquery progressbar plugin * company: tribal-china * author: Andrew * date: 2011-09-25 * version: 1.1.0 */ ; (function($) { // all plugin method var methods = { // init progress bar init: function(options) { var opts = $.extend({}, $.fn.progressbar.settings, options); return this.each(function() { var data = $(this).data('progressbar'); // check whether plugin has been init if (!data) { var percent = '0%'; if (opts.value > opts.min) { percent = Math.round((opts.value - opts.min) / (opts.max - opts.min) * 100) + '%'; } var $barCon = $(this).css({ width: opts.width, height: opts.height }).addClass('progressbar').data('progressbar', { min: opts.min, max: opts.max, value: opts.value, started: false }); var $bar = $('<div />').css({ width: percent, height: opts.height }).addClass('progressbar-value').appendTo($barCon); // bind custom event with namespace '.progressbar' $barCon.bind('change.progressbar', opts.change).bind('complete.progressbar', opts.complete).bind('start.progressbar', opts.start); } }); }, // get min value getMin: function() { return this.data('progressbar').min; }, // get max value getMax: function() { return this.data('progressbar').max; }, // get current value getValue: function() { return this.data('progressbar').value; }, // set current value setValue: function(val) { var min = methods.getMin.apply(this), max = methods.getMax.apply(this), baseData = this.data('progressbar'); // trigger start event if (!baseData.started) { var startEvent = $.extend({}, baseData, { type: 'start.progressbar' }); this.trigger(startEvent); baseData.started = true; } if (val < min) val = min; if (val > max) val = max; baseData.value = val; var percent = Math.round((val - min) / (max - min) * 100) + '%'; this.find('div.progressbar-value').animate({ 'width': percent }, function() { // trigger complete event if (val == max) { var completeEvent = $.extend({}, baseData, { type: 'complete.progressbar', percent: percent }); $(this).parent().trigger(completeEvent); } }); var changeEvent = $.extend({}, baseData, { type: 'change.progressbar', percent: percent }); // trigger change event this.trigger(changeEvent); } }; // options or method $.fn.progressbar = function(method) { if (methods[method]) { return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); } else if ($.isPlainObject(method)) { return methods.init.apply(this, arguments); } else { $.error('progressbar plugin don not support method: ' + method + ', please check'); } }; // default settings $.fn.progressbar.settings = { min: 0, max: 100, value: 0, height: 30, width: 200, start: function(event) {}, change: function(event) {}, complete: function(event) {} }; })(jQuery); // for test var count = 0; done = false; $('#progressbar').progressbar({ min: 10, max: 110, height: 30, width: 200, complete: function(event) { done = true; console.log('job done'); }, change: function(event) { console.log(event.value); } }); setTimeout(function() { count += Math.floor(Math.random() * 10); $('#progressbar').progressbar('setValue', count) if (done) return; setTimeout(arguments.callee, Math.floor(Math.random() * 1000)); }, Math.floor(Math.random() * 1000));
<div id="progressbar"></div>
.progressbar { border: 1px solid #acacac; border-radius: 8px; box-shadow: -1px 1px 5px #8c8c8c inset; background-color:#dcdcdc; overflow: hidden; } .progressbar-value { border-radius: 8px; background-color: #8EEB00; }