mui.number.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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 = $.className('numbox');
  12. var plusClassSelector = $.classSelector('.btn-numbox-plus,.numbox-btn-plus');
  13. var minusClassSelector = $.classSelector('.btn-numbox-minus,.numbox-btn-minus');
  14. var inputClassSelector = $.classSelector('.input-numbox,.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 = parseInt(options.step || 1);
  27. self.options = options;
  28. self.input = $.qsa(inputClassSelector, self.holder)[0];
  29. self.plus = $.qsa(plusClassSelector, self.holder)[0];
  30. self.minus = $.qsa(minusClassSelector, 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 = parseInt(self.input.value) + self.options.step;
  41. self.input.value = val.toString();
  42. $.trigger(self.input, changeEventName, null);
  43. });
  44. self.minus.addEventListener(tapEventName, function(event) {
  45. var val = parseInt(self.input.value) - self.options.step;
  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 = parseInt(self.input.value);
  52. //触发顶层容器
  53. $.trigger(self.holder, changeEventName, {
  54. value: val
  55. });
  56. });
  57. },
  58. /**
  59. * 获取当前值
  60. **/
  61. getValue: function() {
  62. var self = this;
  63. return parseInt(self.input.value);
  64. },
  65. /**
  66. * 验证当前值是法合法
  67. **/
  68. checkValue: function() {
  69. var self = this;
  70. var val = self.input.value;
  71. if (val == null || val == '' || isNaN(val)) {
  72. self.input.value = self.options.min || 0;
  73. self.minus.disabled = self.options.min != null;
  74. } else {
  75. var val = parseInt(val);
  76. if (self.options.max != null && !isNaN(self.options.max) && val >= parseInt(self.options.max)) {
  77. val = self.options.max;
  78. self.plus.disabled = true;
  79. } else {
  80. self.plus.disabled = false;
  81. }
  82. if (self.options.min != null && !isNaN(self.options.min) && val <= parseInt(self.options.min)) {
  83. val = self.options.min;
  84. self.minus.disabled = true;
  85. } else {
  86. self.minus.disabled = false;
  87. }
  88. self.input.value = val;
  89. }
  90. },
  91. /**
  92. * 更新选项
  93. **/
  94. setOption: function(name, value) {
  95. var self = this;
  96. self.options[name] = value;
  97. },
  98. /**
  99. * 动态设置新值
  100. **/
  101. setValue: function(value) {
  102. this.input.value = value;
  103. this.checkValue();
  104. }
  105. });
  106. $.fn.numbox = function(options) {
  107. var instanceArray = [];
  108. //遍历选择的元素
  109. this.each(function(i, element) {
  110. if (element.numbox) {
  111. return;
  112. }
  113. if (options) {
  114. element.numbox = new Numbox(element, options);
  115. } else {
  116. var optionsText = element.getAttribute('data-numbox-options');
  117. var options = optionsText ? JSON.parse(optionsText) : {};
  118. options.step = element.getAttribute('data-numbox-step') || options.step;
  119. options.min = element.getAttribute('data-numbox-min') || options.min;
  120. options.max = element.getAttribute('data-numbox-max') || options.max;
  121. element.numbox = new Numbox(element, options);
  122. }
  123. });
  124. return this[0] ? this[0].numbox : null;
  125. }
  126. //自动处理 class='mui-locker' 的 dom
  127. $.ready(function() {
  128. $('.' + holderClassName).numbox();
  129. });
  130. }(mui));