/**
* 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;
}