mui.numberbox.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /**
  2. * 数字输入框
  3. * varstion 1.0.1
  4. * by Houfeng
  5. * Houfeng@DCloud.io
  6. */
  7. (function ($) {
  8. var touchSupport = ('ontouchstart' in document);
  9. var tapEventName = touchSupport ? 'tap' : 'click';
  10. var changeEventName = 'change';
  11. var holderClassName = 'mui-numbox';
  12. var plusClassName = 'mui-numbox-btn-plus';
  13. var minusClassName = 'mui-numbox-btn-minus';
  14. var inputClassName = 'mui-numbox-input';
  15. var Numbox = $.Numbox = $.Class.extend({
  16. /**
  17. * 构造函数
  18. **/
  19. init: function (holder, options) {
  20. var self = this;
  21. if (!holder) {
  22. throw "构造 numbox 时缺少容器元素";
  23. }
  24. self.holder = holder;
  25. options = options || {};
  26. options.step = parseFloat(options.step || 1);
  27. self.options = options;
  28. self.input = $.qsa('.' + inputClassName, self.holder)[0];
  29. self.plus = $.qsa('.' + plusClassName, self.holder)[0];
  30. self.minus = $.qsa('.' + minusClassName, self.holder)[0];
  31. self.checkValue();
  32. self.initEvent();
  33. },
  34. /**
  35. * 初始化事件绑定
  36. **/
  37. initEvent: function () {
  38. var self = this;
  39. self.plus.addEventListener(tapEventName, function (event) {
  40. var val = ((parseFloat(self.input.value) + self.options.step) || 0).toFixed(2);
  41. self.input.value = val.toString();
  42. $.trigger(self.input, changeEventName, null);
  43. });
  44. self.minus.addEventListener(tapEventName, function (event) {
  45. var val = ((parseFloat(self.input.value) - self.options.step) || 0).toFixed(2);
  46. self.input.value = val.toString();
  47. $.trigger(self.input, changeEventName, null);
  48. });
  49. self.input.addEventListener(changeEventName, function (event) {
  50. self.checkValue();
  51. var val = (parseFloat(self.input.value) || 0).toFixed(2);
  52. //触发顶层容器
  53. $.trigger(self.holder, changeEventName, {
  54. value: val
  55. });
  56. });
  57. // 避免输出太多位小数; 后续如果有精度要求,可以在input设置精度属性
  58. self.input.addEventListener('blur', function () {
  59. self.input.value = (parseFloat(self.input.value) || 0).toFixed(2);
  60. });
  61. },
  62. /**
  63. * 获取当前值
  64. **/
  65. getValue: function () {
  66. var self = this;
  67. return parseFloat(self.input.value);
  68. },
  69. /**
  70. * 验证当前值是法合法
  71. **/
  72. checkValue: function () {
  73. var self = this;
  74. var val = self.input.value;
  75. if (val == null || val == '' || isNaN(val)) {
  76. self.input.value = self.options.min || 0;
  77. self.minus.disabled = self.options.min != null;
  78. } else {
  79. var val = parseFloat(val);
  80. if (self.options.max != null && !isNaN(self.options.max) && val >= parseFloat(self.options.max)) {
  81. val = self.options.max;
  82. self.plus.disabled = true;
  83. } else {
  84. self.plus.disabled = false;
  85. }
  86. if (self.options.min != null && !isNaN(self.options.min) && val <= parseFloat(self.options.min)) {
  87. val = self.options.min;
  88. self.minus.disabled = true;
  89. } else {
  90. self.minus.disabled = false;
  91. }
  92. self.input.value = val;
  93. }
  94. },
  95. /**
  96. * 更新选项
  97. **/
  98. setOption: function (name, value) {
  99. var self = this;
  100. self.options[name] = value;
  101. }
  102. });
  103. $.fn.numbox = function (options) {
  104. var instanceArray = [];
  105. //遍历选择的元素
  106. this.each(function (i, element) {
  107. if (element.numbox) return;
  108. if (options) {
  109. element.numbox = new Numbox(element, options);
  110. } else {
  111. var optionsText = element.getAttribute('data-numbox-options');
  112. var options = optionsText ? JSON.parse(optionsText) : {};
  113. options.step = element.getAttribute('data-numbox-step') || options.step;
  114. options.min = element.getAttribute('data-numbox-min') || options.min;
  115. options.max = element.getAttribute('data-numbox-max') || options.max;
  116. element.numbox = new Numbox(element, options);
  117. }
  118. });
  119. return this[0] ? this[0].numbox : null;
  120. }
  121. //自动处理 class='mui-locker' 的 dom
  122. $.ready(function () {
  123. $('.' + holderClassName).numbox();
  124. });
  125. }(mui))