¡¡¡¡´ËÏîÄ¿µÄdemoÍøÕ¾http://wijmo.com/Wijmo-Open/samples/
¡¡¡¡
¡¡¡¡/*
¡¡¡¡* wijprogressbar Widget. V1.0
¡¡¡¡*
¡¡¡¡* Copyright (c) Componentone Inc.
¡¡¡¡*
¡¡¡¡* Depends:
¡¡¡¡* Jquery-1.4.2.js
¡¡¡¡* jquery.ui.core.js
¡¡¡¡* jquery.ui.widget.js
¡¡¡¡*
¡¡¡¡*Optional dependence for effect settings:
¡¡¡¡* jquery.effects.core.js
¡¡¡¡* jquery.effects.blind.js
¡¡¡¡* jquery.effects.bounce.js
¡¡¡¡* jquery.effects.clip.js
¡¡¡¡* jquery.effects.drop.js
¡¡¡¡* jquery.effects.explode.js
¡¡¡¡* jquery.effects.fold.js
¡¡¡¡* jquery.effects.hightlight.js
¡¡¡¡* jquery.effects.pulsate.js
¡¡¡¡* jquery.effects.scale.js
¡¡¡¡* jquery.effects.shake.js
¡¡¡¡* jquery.effects.slide.js
¡¡¡¡* jquery.effects.transfer.js
¡¡¡¡* HTML:
¡¡¡¡* <div id="progressbar" style="width:***;height:***"></div>
¡¡¡¡*/
¡¡¡¡(function ($) {
¡¡¡¡$.widget("ui.wijprogressbar", $.ui.progressbar, {
¡¡¡¡options: {
¡¡¡¡/// <summary>
¡¡¡¡///The label's alignment on the progress bar. The value should be "east", "west", "center", "north", "south" or "running".
¡¡¡¡///Default:"center".
¡¡¡¡///Type:String.
¡¡¡¡///Code sample:$('.selector').wijprogressbar('option','labelAlign','center').
¡¡¡¡///</summary>
¡¡¡¡labelAlign: "center",
¡¡¡¡/// <summary>
¡¡¡¡///The value of the progress bar,the type should be numeric.
¡¡¡¡///Default:0.
¡¡¡¡///Type:Number.
¡¡¡¡///Code sample:$('.selector').wijprogressbar('option','value',60).
¡¡¡¡///</summary>
¡¡¡¡maxValue: 100,
¡¡¡¡/// <summary>
¡¡¡¡///The minimum value of the progress bar,the type should be numeric.
¡¡¡¡///Default:0.
¡¡¡¡///Type:Number.
¡¡¡¡///Code sample:$('.selector').wijprogressbar('option','minValue',0).
¡¡¡¡///</summary>
¡¡¡¡minValue: 0,
¡¡¡¡/// <summary>
¡¡¡¡///The fill direction of the progress bar.the value should be "east", "west", "north" or "south".
¡¡¡¡///Default:"east".
¡¡¡¡///Type:String.
¡¡¡¡///Code sample:$('.selector').wijprogressbar('option','fillDirection','east').
¡¡¡¡///</summary>
¡¡¡¡fillDirection: "east",
¡¡¡¡/// <summary>
¡¡¡¡///The progressbar's orientation.the value should be 'horizontal' or 'vertical'.
¡¡¡¡///Default:"horizontal".
¡¡¡¡///Type:String.
¡¡¡¡///Code sample:$('selector').wijprogressbar('option','orientation','horizontal').
¡¡¡¡///</summary>
¡¡¡¡///orientation: "horizontal",
¡¡¡¡/// <summary>
¡¡¡¡///Sets the format of the label text.The available formats are as follows:
¡¡¡¡///{0} or {ProgressValue} express the current progress Value.
¡¡¡¡///{1} or {PercentProgress} express the current percent of the progress bar.
¡¡¡¡///{2} or {RemainingProgress} express the remaining progress of the progress bar.
¡¡¡¡///{3} or {PercentageRemaining} express the remaining percent of the progress bar.
¡¡¡¡///{4} or {Min} express the min Vlaue of the progress bar.
¡¡¡¡///{5} or {Max} express the max Value of the progress bar.
¡¡¡¡///Default:"{1}%".
¡¡¡¡///Type:String.
¡¡¡¡///Code sample:$('.selector').wijprogressbar('option','labelFormatString','{0}%').
¡¡¡¡///</summary>
¡¡¡¡labelFormatString: "{1}%",
¡¡¡¡/// <summary>
¡¡¡¡///Set the format of the ToolTip of the progress bar,the expression of the format like the labelFormatString.
¡¡¡¡///Default:"{1}%".
¡¡¡¡///Type:String.
¡¡¡¡///Code sample:$('.selector').wijprogressbar('option','toolTipFormatString','{1}%').
¡¡¡¡///</summary>
¡¡¡¡toolTipFormatString: "{1}%",
¡¡¡¡/// <summary>
¡¡¡¡///The increment of the progress bar's indicator.
¡¡¡¡///Default:1.
¡¡¡¡///Type:Number.
¡¡¡¡///</summary>
¡¡¡¡///Code sample:$('.selector').wijprogressbar('option','indicatorIncrement',10).
¡¡¡¡indicatorIncrement: 1,
¡¡¡¡/// <summary>
¡¡¡¡///The Image's url of the indicator.
¡¡¡¡///Default:"".
¡¡¡¡///Type:String.
¡¡¡¡///Code sample:$('.selector').wijprogressbar('option','indicatorImage','images/abc.png').
¡¡¡¡///</summary>
¡¡¡¡indicatorImage: "",
¡¡¡¡/// <summary>
¡¡¡¡///The delay of the progressbar's animation.
¡¡¡¡///Default:0.
¡¡¡¡///Type:Number.
¡¡¡¡///Code sample:$('.selector').wijprogressbar('option',
¡¡¡¡///</summary>
¡¡¡¡animationDelay: 0,
¡¡¡¡/// <summary>
¡¡¡¡///The options parameter of the jQuery's animation.
¡¡¡¡///Default:"{animated:'progress',duration:500}".
¡¡¡¡///Type:Options.
¡¡¡¡///Code sample:$('.selector').wijprogressbar('option','animationOptions',{animated:'progress',duration:600}).
¡¡¡¡///</summary>
¡¡¡¡animationOptions: {
¡¡¡¡animated: 'progress',
¡¡¡¡duration: 500
¡¡¡¡}
¡¡¡¡},
¡¡¡¡¡¡¡¡¡¡//when set the options, trigger this method.
¡¡¡¡_setOption: function (key, value) {
¡¡¡¡var val, self = this;
¡¡¡¡switch (key) {
¡¡¡¡case "value":
¡¡¡¡val = parseInt(value);
¡¡¡¡self.options[key] = val;
¡¡¡¡self._refreshValue(val);
¡¡¡¡break;
¡¡¡¡case "maxValue":
¡¡¡¡case "minValue":
¡¡¡¡val = parseInt(value);
¡¡¡¡self.options[key] = val;
¡¡¡¡self[key === "maxValue" ? "max" : "min"] = val;
¡¡¡¡self._refreshValue();
¡¡¡¡break;
¡¡¡¡case "labelFormatString":
¡¡¡¡case "toolTipFormatString":
¡¡¡¡self.options[key] = value;
¡¡¡¡self._refreshValue();
¡¡¡¡//$.Widget.prototype._setOption.apply(this, arguments);
¡¡¡¡break;
¡¡¡¡case "orientation":
¡¡¡¡case "fillDirection":
¡¡¡¡case "labelAlign":
¡¡¡¡case "indicatorImage":
¡¡¡¡self.options[key] = value;
¡¡¡¡self._initElements();
¡¡¡¡self._refreshValue();
¡¡¡¡//$.Widget.prototype._setOption.apply(this, arguments);
¡¡¡¡break;
¡¡¡¡case "indicatorIncrement":
¡¡¡¡value = (value == 0 ? 1 : value);
¡¡¡¡self.options[key] = value;
¡¡¡¡self._initElements();
¡¡¡¡self._refreshValue();
¡¡¡¡break;
¡¡¡¡default: break;
¡¡¡¡}
¡¡¡¡$.Widget.prototype._setOption.apply(self, arguments);
¡¡¡¡},
¡¡¡¡¡¡¡¡¡¡///create the widget
¡¡¡¡_create: function () {
¡¡¡¡var self = this;
¡¡¡¡self.min = self.options.minValue;
¡¡¡¡self.max = self.options.maxValue;
¡¡¡¡self.element.addClass("ui-wijprogressbar");
¡¡¡¡$.ui.progressbar.prototype._create.apply(self, arguments);
¡¡¡¡self.label = $("<span>").addClass("ui-progressbar-label ui-corner-left").appendTo(self.valueDiv);
¡¡¡¡self._initElements();
¡¡¡¡self._isInit = true;
¡¡¡¡self._refreshValue();
¡¡¡¡},
¡¡¡¡¡¡¡¡¡¡///Trigger the pressbar event.
¡¡¡¡_triggerEvent: function (eventName, oldValue, newValue, cancel) {
¡¡¡¡var ea = $.Event(eventName);
¡¡¡¡ea.data = {
¡¡¡¡oldValue: oldValue,
¡¡¡¡newValue: newValue,
¡¡¡¡cancel: cancel
¡¡¡¡};
¡¡¡¡this._trigger(eventName, ea);
¡¡¡¡return ea.data.cancel;
¡¡¡¡},
¡¡¡¡¡¡¡¡//refresh the progress value.
¡¡¡¡_refreshValue: function () {
¡¡¡¡var self = this;
¡¡¡¡if (!self._isInit) {
¡¡¡¡return;
¡¡¡¡}
¡¡¡¡var value = self.value();
¡¡¡¡var percent = (value - self.min) / (self.max - self.min) * 100;
¡¡¡¡var o = self.options;
¡¡¡¡var cancel = self._triggerEvent("beforeProgressChanging", self.element.attr("aria-valuenow"), value, false);
¡¡¡¡if (cancel) {
¡¡¡¡return;
¡¡¡¡}
¡¡¡¡self.valueDiv.css({
¡¡¡¡width: "",
¡¡¡¡height: ""
¡¡¡¡});
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡// If have animation.
¡¡¡¡if (o.animationOptions.animated && o.animationOptions.duration > 0) {
¡¡¡¡setTimeout($.proxy(function () {
¡¡¡¡var o = self.options.animationOptions;
¡¡¡¡var animateOptions = {
¡¡¡¡content: self.valueDiv,
¡¡¡¡complete: $.proxy(function () {
¡¡¡¡self._triggerEvent("progressChanged", self.element.attr("aria-valuenow"), value, false);
¡¡¡¡}, self),
¡¡¡¡step: $.proxy(function (ovalue) {
¡¡¡¡self._performAnimating(ovalue);
¡¡¡¡}, self),
¡¡¡¡processValue: percent
¡¡¡¡}
¡¡¡¡var animations = $.ui.wijprogressbar.animations;
¡¡¡¡var duration = o.duration;
¡¡¡¡var easing = o.animated;
¡¡¡¡if (easing && !animations[easing]) {
¡¡¡¡easing = "progress";
¡¡¡¡}
¡¡¡¡if (!animations[easing]) {
¡¡¡¡animations[easing] = function (options) {
¡¡¡¡this.progress(options, {
¡¡¡¡easing: easing,
¡¡¡¡duration: duration || 1000
¡¡¡¡});
¡¡¡¡}
¡¡¡¡}
¡¡¡¡animations[easing](animateOptions, self.options.animationOptions);
¡¡¡¡}, self), o.animationDelay);
¡¡¡¡}
¡¡¡¡else {
¡¡¡¡//trigger the progressChanged event.
¡¡¡¡var oldValue = self.element.attr("aria-valuenow");
¡¡¡¡self._refreshProgress(percent);
¡¡¡¡self._triggerEvent("progressChanged", oldValue, value, false);
¡¡¡¡}
¡¡¡¡},
¡¡¡¡¡¡¡¡¡¡¡¡¡¡///Set the label's position of the progress bar.
¡¡¡¡_setLabelSide: function () {
¡¡¡¡var self = this;
¡¡¡¡var fillDirection = self.options.fillDirection;
¡¡¡¡var labelAlign = self.options.labelAlign;
¡¡¡¡if (self._isHorizontal()) {
¡¡¡¡if (labelAlign === "west" || labelAlign === "east" || labelAlign === "center") {
¡¡¡¡self.label.css("width", self.element.width() + 'px');
¡¡¡¡}
¡¡¡¡else
¡¡¡¡if (labelAlign === "running") {
¡¡¡¡self.label.css("width", "auto");
¡¡¡¡}
¡¡¡¡else {
¡¡¡¡self.element.css("line-height", "normal");
¡¡¡¡self.valueDiv.css("line-height", "normal");
¡¡¡¡self.label.css("height", labelAlign === "north" ? self.element.height() + 'px' : "auto");
¡¡¡¡}
¡¡¡¡}
¡¡¡¡else {
¡¡¡¡if (labelAlign === "west" || labelAlign === "east" || labelAlign === "center") {
¡¡¡¡self.label.css({ "line-height": self.element.height() + 'px', "width": self.element.width() + 'px' });
¡¡¡¡}
¡¡¡¡else
¡¡¡¡if (labelAlign === "running") {
¡¡¡¡self.label.css({ "height": "auto", "width": self.element.width() + 'px' });
¡¡¡¡}
¡¡¡¡else {
¡¡¡¡self.element.css("line-height", "normal");
¡¡¡¡self.valueDiv.css("line-height", "normal");
¡¡¡¡self.label.css("height", labelAlign === "north" ? self.element.height() + 'px' : "auto");
¡¡¡¡}
¡¡¡¡}
¡¡¡¡},
¡¡¡¡¡¡¡¡¡¡¡¡¡¡///get the progress bar's progress orientation.
¡¡¡¡_isHorizontal: function () {
¡¡¡¡return this.options.fillDirection === "west" || this.options.fillDirection === "east";
¡¡¡¡},
¡¡¡¡¡¡¡¡///start the progress
¡¡¡¡startTask: function () {
¡¡¡¡/// <summary>Start the progress</summary>
¡¡¡¡if ($(":animated", this.element).length == 0) {
¡¡¡¡var value = this.value();
¡¡¡¡this._refreshValue(value);
¡¡¡¡}
¡¡¡¡},
¡¡¡¡¡¡¡¡¡¡¡¡¡¡///stop the progress
¡¡¡¡stopTask: function () {
¡¡¡¡/// <summary>Stop the progress</summary>
¡¡¡¡this.valueDiv.stop();
¡¡¡¡},
¡¡¡¡¡¡¡¡¡¡¡¡¡¡//init the progress bar
¡¡¡¡_initElements: function () {
¡¡¡¡var self = this;
¡¡¡¡var o = self.options;
¡¡¡¡self.element.removeClass("ui-wijprogressbar-west ui-wijprogressbar-east ui-wijprogressbar-north ui-wijprogressbar-south").addClass("ui-wijprogressbar-" + o.fillDirection);
¡¡¡¡var height = self.element.height();
¡¡¡¡self.valueDiv.css("line-height", "");
¡¡¡¡self.label.removeClass("lb_west lb_east lb_south lb_north lb_center lb_running").addClass("lb_" + o.labelAlign)
¡¡¡¡.css("line-height", "").css({
¡¡¡¡left: "",
¡¡¡¡right: "",
¡¡¡¡top: "",
¡¡¡¡bottom: ""
¡¡¡¡});
¡¡¡¡if (self._isHorizontal()) {
¡¡¡¡self.valueDiv.height(height)
¡¡¡¡.css("line-height", height + "px");
¡¡¡¡}
¡¡¡¡else {
¡¡¡¡self.valueDiv.width(self.element.width());
¡¡¡¡}
¡¡¡¡self._setLabelSide();
¡¡¡¡if (self.options.indicatorImage !== "") {
¡¡¡¡self.valueDiv.css("background", "transparent url(" + self.options.indicatorImage + ") repeat fixed");
¡¡¡¡}
¡¡¡¡},
¡¡¡¡¡¡¡¡¡¡///refresh the progress
¡¡¡¡_refreshProgress: function (value) {
¡¡¡¡var self = this;
¡¡¡¡var ea = new $.Event('progressChanging');
¡¡¡¡var nowValue = value * (self.max - self.min) / 100 + self.min;
¡¡¡¡var o = self.options;
¡¡¡¡var cancel = self._triggerEvent("progressChanging", self.element.attr("aria-valuenow"), nowValue, false);
¡¡¡¡if (cancel) {
¡¡¡¡return;
¡¡¡¡}
¡¡¡¡if (self._isHorizontal()) {
¡¡¡¡self.valueDiv.toggleClass(o.fillDirection === "east" ? "ui-corner-right" : "ui-corner-left", value === self.max).width(value + "%");
¡¡¡¡}
¡¡¡¡else {
¡¡¡¡self.valueDiv.toggleClass(o.fillDirection === "south" ? "ui-corner-bottom" : "ui-corner-top", value === self.max).height(value + "%");
¡¡¡¡}
¡¡¡¡self.element.attr("aria-valuenow", nowValue);
¡¡¡¡var txt = self._getFormatString(o.labelFormatString, value);
¡¡¡¡self._setLabelsText(txt);
¡¡¡¡var _tooTip = self._getFormatString(o.toolTipFormatString, value);
¡¡¡¡self.element.attr("title", _tooTip);
¡¡¡¡},
¡¡¡¡¡¡¡¡¡¡///play progress animation.
¡¡¡¡_performAnimating: function (obj) {
¡¡¡¡var self = this;
¡¡¡¡var len = Math.floor(obj / self.options.indicatorIncrement);
¡¡¡¡obj = len * self.options.indicatorIncrement;
¡¡¡¡var o = self.options;
¡¡¡¡self._refreshProgress(obj);
¡¡¡¡if (o.labelAlign === "running") {
¡¡¡¡if (self._isHorizontal()) {
¡¡¡¡var eleWidth = self.element.width();
¡¡¡¡var labelWidth = self.label.outerWidth();
¡¡¡¡var progressWidth = self.valueDiv.outerWidth();
¡¡¡¡var left = eleWidth === progressWidth ? eleWidth - labelWidth : obj * eleWidth / 100 - labelWidth + labelWidth * (eleWidth - progressWidth) / eleWidth;
¡¡¡¡self.label.css(o.fillDirection === "east" ? "left" : "right", left);
¡¡¡¡}
¡¡¡¡else {
¡¡¡¡var eleHeight = self.element.height();
¡¡¡¡var labelHeight = self.label.outerHeight();
¡¡¡¡var progressHeight = self.valueDiv.outerHeight();
¡¡¡¡var top = eleHeight === progressHeight ? eleHeight - labelHeight : obj * eleHeight / 100 - labelHeight + labelHeight * (eleHeight - progressHeight) / eleHeight;
¡¡¡¡self.label.css(o.fillDirection === "south" ? "top" : "bottom", top);
¡¡¡¡}
¡¡¡¡}
¡¡¡¡},
¡¡¡¡¡¡¡¡¡¡¡¡¡¡//set the label'text
¡¡¡¡_setLabelsText: function (text) {
¡¡¡¡if (!this._isHorizontal() && this.options.labelAlign === "rightOrBottom") {
¡¡¡¡this.label.html('<span style=\'position:absolute;bottom:0px;text-align:center;width:' + this.element.width() + 'px;\'>' + text + '</span>');
¡¡¡¡return;
¡¡¡¡}
¡¡¡¡this.label.html(text);
¡¡¡¡},
¡¡¡¡¡¡¡¡¡¡¡¡¡¡//format the text
¡¡¡¡_getFormatString: function (format, val) {
¡¡¡¡var self = this;
¡¡¡¡var processValue = parseInt(self.element.attr("aria-valuenow"));
¡¡¡¡var remainingProcess = self.max - processValue
¡¡¡¡var percentProgress = val;
¡¡¡¡var percentageRemaining = 100 - val;
¡¡¡¡var r = /\{0\}/g;
¡¡¡¡format = format.replace(r, processValue.toString());
¡¡¡¡r = /\{ProgressValue\}/g;
¡¡¡¡format = format.replace(r, processValue.toString());
¡¡¡¡r = /\{1\}/g;
¡¡¡¡format = format.replace(r, percentProgress.toString());
¡¡¡¡r = /\{PercentProgress\}/g;
¡¡¡¡format = format.replace(r, percentProgress.toString());
¡¡¡¡r = /\{2\}/g;
¡¡¡¡format = format.replace(r, remainingProcess.toString());
¡¡¡¡r = /\{RemainingProgress\}/g;
¡¡¡¡format = format.replace(r, remainingProcess.toString());
¡¡¡¡r = /\{3\}/g;
¡¡¡¡format = format.replace(r, percentageRemaining.toString());
¡¡¡¡r = /\{PercentageRemaining\}/g;
¡¡¡¡format = format.replace(r, percentageRemaining.toString());
¡¡¡¡r = /\{4\}/g;
¡¡¡¡format = format.replace(r, self.min);
¡¡¡¡r = /\{Min\}/g;
¡¡¡¡format = format.replace(r, self.min);
¡¡¡¡r = /\{5\}/g;
¡¡¡¡format = format.replace(r, self.max);
¡¡¡¡r = /\{Max\}/g;
¡¡¡¡format = format.replace(r, self.max);
¡¡¡¡return format;
¡¡¡¡},
¡¡¡¡¡¡¡¡¡¡¡¡¡¡///destroy the widget.
¡¡¡¡destroy: function () {
¡¡¡¡this.element.empty();
¡¡¡¡this.element.removeClass("ui-wijprogressbar ui-widget ui-widget-content ui-corner-all ui-wijprogressbar-h").removeAttr("title");
¡¡¡¡$.Widget.prototype.destroy.apply(this, arguments);
¡¡¡¡}
¡¡¡¡});
¡¡¡¡///progress bar animation. If user want to write custom animation,can override the animations option.And set the animated to the options key.
¡¡¡¡$.extend($.ui.wijprogressbar, {
¡¡¡¡animations: {
¡¡¡¡progress: function (options, additions) {
¡¡¡¡options = $.extend({
¡¡¡¡easing: "swing",
¡¡¡¡duration: 1000
¡¡¡¡}, options, additions);
¡¡¡¡options.content.stop(true, true).animate({
¡¡¡¡widthvalue: options.processValue
¡¡¡¡}, options);
¡¡¡¡}
¡¡¡¡}
¡¡¡¡});
¡¡¡¡})(jQuery);
¡¡¡¡widgetÖ÷ÒªÊÇ´¦Àíui²ãÃæµÄ£¬ÊµÓÃÓë·ñÖ»ÓÐÓÃÁ˲ÅÖªµÀ£¬widget¿ÉÒÔÀûÓÃjQueryÒѾ´æÔÚµÄcss framework¡£ÀûÓÃthemeRoller£¬¿ÉÒÔºÜÇáËɵĻ»·ô¡£ÖÁÓÚ˵¹¦ÄÜ£¬¿ÉÒÔÔÚÓû§·´À¡ºóÔÙÂýÂýÍêÉÆ¡£
¡¡¡¡Õâ¸öprogressbar±¾ÉíÊǼ̳Ð×ÔjQuery ui progressbarµÄ¡£ÒòΪ¿ªÔ´£¬Èç¹û×Ô¼ºÓкõÄÏë·¨£¬×Ô¼ºÒ²¿ÉÒÔÈ¥Ôö¼Ó×Ô¼ºÐèÒªµÄ¹¦ÄÜ¡£