mui.progressbar.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. (function($, document) {
  2. var CLASS_PROGRESSBAR = $.className('progressbar');
  3. var CLASS_PROGRESSBAR_IN = $.className('progressbar-in');
  4. var CLASS_PROGRESSBAR_OUT = $.className('progressbar-out');
  5. var CLASS_PROGRESSBAR_INFINITE = $.className('progressbar-infinite');
  6. var SELECTOR_PROGRESSBAR = $.classSelector('.progressbar');
  7. var _findProgressbar = function(container) {
  8. container = $(container || 'body');
  9. if (container.length === 0) return;
  10. container = container[0];
  11. if (container.classList.contains(CLASS_PROGRESSBAR)) {
  12. return container;
  13. }
  14. var progressbars = container.querySelectorAll(SELECTOR_PROGRESSBAR);
  15. if (progressbars) {
  16. for (var i = 0, len = progressbars.length; i < len; i++) {
  17. var progressbar = progressbars[i];
  18. if (progressbar.parentNode === container) {
  19. return progressbar;
  20. }
  21. }
  22. }
  23. };
  24. /**
  25. * 创建并显示进度条
  26. * @param {Object} container 可选,默认body,支持selector,DOM Node,mui wrapper
  27. * @param {Object} progress 可选,undefined表示循环,数字表示具体进度
  28. * @param {Object} color 可选,指定颜色样式(目前暂未提供实际样式,可暂时不暴露此参数)
  29. */
  30. var showProgressbar = function(container, progress, color) {
  31. if (typeof container === 'number') {
  32. color = progress;
  33. progress = container;
  34. container = 'body';
  35. }
  36. container = $(container || 'body');
  37. if (container.length === 0) return;
  38. container = container[0];
  39. var progressbar;
  40. if (container.classList.contains(CLASS_PROGRESSBAR)) {
  41. progressbar = container;
  42. } else {
  43. var progressbars = container.querySelectorAll(SELECTOR_PROGRESSBAR + ':not(.' + CLASS_PROGRESSBAR_OUT + ')');
  44. if (progressbars) {
  45. for (var i = 0, len = progressbars.length; i < len; i++) {
  46. var _progressbar = progressbars[i];
  47. if (_progressbar.parentNode === container) {
  48. progressbar = _progressbar;
  49. break;
  50. }
  51. }
  52. }
  53. if (!progressbar) {
  54. progressbar = document.createElement('span');
  55. progressbar.className = CLASS_PROGRESSBAR + ' ' + CLASS_PROGRESSBAR_IN + (typeof progress !== 'undefined' ? '' : (' ' + CLASS_PROGRESSBAR_INFINITE)) + (color ? (' ' + CLASS_PROGRESSBAR + '-' + color) : '');
  56. if (typeof progress !== 'undefined') {
  57. progressbar.innerHTML = '<span></span>';
  58. }
  59. container.appendChild(progressbar);
  60. } else {
  61. progressbar.classList.add(CLASS_PROGRESSBAR_IN);
  62. }
  63. }
  64. if (progress) setProgressbar(container, progress);
  65. return progressbar;
  66. };
  67. /**
  68. * 关闭进度条
  69. * @param {Object} container 可选,默认body,支持selector,DOM Node,mui wrapper
  70. */
  71. var hideProgressbar = function(container) {
  72. var progressbar = _findProgressbar(container);
  73. if (!progressbar) {
  74. return;
  75. }
  76. var classList = progressbar.classList;
  77. if (!classList.contains(CLASS_PROGRESSBAR_IN) || classList.contains(CLASS_PROGRESSBAR_OUT)) {
  78. return;
  79. }
  80. classList.remove(CLASS_PROGRESSBAR_IN);
  81. classList.add(CLASS_PROGRESSBAR_OUT);
  82. progressbar.addEventListener('webkitAnimationEnd', function() {
  83. progressbar.parentNode && progressbar.parentNode.removeChild(progressbar);
  84. progressbar = null;
  85. });
  86. return;
  87. };
  88. /**
  89. * 设置指定进度条进度
  90. * @param {Object} container 可选,默认body,支持selector,DOM Node,mui wrapper
  91. * @param {Object} progress 可选,默认0 取值范围[0-100]
  92. * @param {Object} speed 进度条动画时间
  93. */
  94. var setProgressbar = function(container, progress, speed) {
  95. if (typeof container === 'number') {
  96. speed = progress;
  97. progress = container;
  98. container = false;
  99. }
  100. var progressbar = _findProgressbar(container);
  101. if (!progressbar || progressbar.classList.contains(CLASS_PROGRESSBAR_INFINITE)) {
  102. return;
  103. }
  104. if (progress) progress = Math.min(Math.max(progress, 0), 100);
  105. progressbar.offsetHeight;
  106. var span = progressbar.querySelector('span');
  107. if (span) {
  108. var style = span.style;
  109. style.webkitTransform = 'translate3d(' + (-100 + progress) + '%,0,0)';
  110. if (typeof speed !== 'undefined') {
  111. style.webkitTransitionDuration = speed + 'ms';
  112. } else {
  113. style.webkitTransitionDuration = '';
  114. }
  115. }
  116. return progressbar;
  117. };
  118. $.fn.progressbar = function(options) {
  119. var progressbarApis = [];
  120. options = options || {};
  121. this.each(function() {
  122. var self = this;
  123. var progressbarApi = self.mui_plugin_progressbar;
  124. if (!progressbarApi) {
  125. self.mui_plugin_progressbar = progressbarApi = {
  126. options: options,
  127. setOptions: function(options) {
  128. this.options = options;
  129. },
  130. show: function() {
  131. return showProgressbar(self, this.options.progress, this.options.color);
  132. },
  133. setProgress: function(progress) {
  134. return setProgressbar(self, progress);
  135. },
  136. hide: function() {
  137. return hideProgressbar(self);
  138. }
  139. };
  140. } else if (options) {
  141. progressbarApi.setOptions(options);
  142. }
  143. progressbarApis.push(progressbarApi);
  144. });
  145. return progressbarApis.length === 1 ? progressbarApis[0] : progressbarApis;
  146. };
  147. // $.setProgressbar = setProgressbar;
  148. // $.showProgressbar = showProgressbar;
  149. // $.hideProgressbar = hideProgressbar;
  150. })(mui, document);