114 lines
4.1 KiB
JavaScript
114 lines
4.1 KiB
JavaScript
;
|
|
(function($, window, document, undefined) {
|
|
'use strict';
|
|
|
|
var output = function(msg) {
|
|
window.console && console.log(msg);
|
|
};
|
|
|
|
var WanSpinner = function(element, options) {
|
|
this.defaults = {
|
|
maxValue: 999,
|
|
minValue: -999,
|
|
step: 1,
|
|
start: 1,
|
|
inputWidth: 40,
|
|
plusClick: function(element, val) {
|
|
return true;
|
|
},
|
|
minusClick: function(element, val) {
|
|
return true;
|
|
},
|
|
exceptionFun: function(element, exp) {
|
|
return true;
|
|
},
|
|
valueChanged: function(element, val) {
|
|
return true;
|
|
}
|
|
};
|
|
this.options = $.extend({}, this.defaults, options);
|
|
this.options.stepLength = ((+this.options.step).toString().split('.')[1] || '').length;
|
|
this.options.stepFloat = parseInt(1 * Math.pow(10, this.options.stepLength) / this.options.step) || 1;
|
|
this.element = $(element);
|
|
|
|
this.options.exceptionFunEnable = (typeof(this.options.exceptionFun) === 'function');
|
|
this.options.plusClickEnable = (typeof(this.options.plusClick) === 'function');
|
|
this.options.minusClickEnable = (typeof(this.options.minusClick) === 'function');
|
|
this.options.valueChangedEnable = (typeof(this.options.valueChanged) === 'function');
|
|
|
|
this.element.each(function(index, dt) {
|
|
var input = $(dt).children('input');
|
|
var initValue = input.val() || this.options.start;
|
|
input.val(initValue);
|
|
});
|
|
|
|
this.element.children('input').css('width', this.options.inputWidth);
|
|
|
|
this.EXCEPTION = {
|
|
TOO_LARGE: 1,
|
|
NORMAL: 0,
|
|
TOO_SMALL: -1
|
|
};
|
|
};
|
|
|
|
WanSpinner.prototype.bind = function() {
|
|
var self = this;
|
|
$(self.element).delegate('.minus', 'click', function() {
|
|
var val;
|
|
var input = $(this).siblings('input');
|
|
if (self.options.stepFloat > 1) {
|
|
val = (+input.val() || 0) * self.options.stepFloat - self.options.step * self.options.stepFloat;
|
|
val = Math.round(val) / self.options.stepFloat;
|
|
} else {
|
|
val = (+input.val() || 0) - self.options.step;
|
|
}
|
|
val = val.toFixed(self.options.stepLength);
|
|
if (val < self.options.minValue) {
|
|
self.options.exceptionFunEnable && self.options.exceptionFun($(this).parent(), self.EXCEPTION.TOO_SMALL);
|
|
} else {
|
|
input.val(val);
|
|
self.options.minusClickEnable && self.options.minusClick($(this).parent(), val);
|
|
self.options.valueChangedEnable && self.options.valueChanged($(this).parent(), val);
|
|
}
|
|
return false;
|
|
}).delegate('.plus', 'click', function() {
|
|
var val;
|
|
var input = $(this).siblings('input');
|
|
if (self.options.stepFloat > 1) {
|
|
val = (+input.val() || 0) * self.options.stepFloat + self.options.step * self.options.stepFloat;
|
|
val = Math.round(val) / self.options.stepFloat;
|
|
} else {
|
|
val = (+input.val() || 0) + self.options.step;
|
|
}
|
|
val = val.toFixed(self.options.stepLength);
|
|
if (val > self.options.maxValue) {
|
|
self.options.exceptionFunEnable && self.options.exceptionFun($(this).parent(), self.EXCEPTION.TOO_LARGE);
|
|
} else {
|
|
input.val(val);
|
|
self.options.plusClickEnable && self.options.plusClick($(this).parent(), val);
|
|
self.options.valueChangedEnable && self.options.valueChanged($(this).parent(), val);
|
|
}
|
|
return false;
|
|
}).delegate('input', 'change', function() {
|
|
var val = +$(this).val() || 0;
|
|
if (val > self.options.maxValue) {
|
|
val = self.options.maxValue;
|
|
self.options.exceptionFunEnable && self.options.exceptionFun($(this).parent(), self.EXCEPTION.TOO_LARGE);
|
|
} else if (val < self.options.minValue) {
|
|
val = self.options.minValue;
|
|
self.options.exceptionFunEnable && self.options.exceptionFun($(this).parent(), self.EXCEPTION.TOO_SMALL);
|
|
}
|
|
$(this).val(val);
|
|
self.options.valueChangedEnable && self.options.valueChanged($(this).parent(), val);
|
|
});
|
|
}
|
|
|
|
|
|
$.fn.WanSpinner = function(options) {
|
|
var wanSpinner = new WanSpinner(this, options);
|
|
wanSpinner.bind();
|
|
return this;
|
|
};
|
|
|
|
})(jQuery, window, document);
|