mui.poppicker.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. /**
  2. * 弹出选择列表插件
  3. * 此组件依赖 listpcker ,请在页面中先引入 mui.picker.css + mui.picker.js
  4. * varstion 1.0.1
  5. * by Houfeng
  6. * Houfeng@DCloud.io
  7. * Update By HaoYanbing 20171213 添加数据过滤功能
  8. */
  9. (function($, document) {
  10. //创建 DOM
  11. $.dom = function(str) {
  12. if (typeof(str) !== 'string') {
  13. if ((str instanceof Array) || (str[0] && str.length)) {
  14. return [].slice.call(str);
  15. } else {
  16. return [str];
  17. }
  18. }
  19. if (!$.__create_dom_div__) {
  20. $.__create_dom_div__ = document.createElement('div');
  21. }
  22. $.__create_dom_div__.innerHTML = str;
  23. return [].slice.call($.__create_dom_div__.childNodes);
  24. };
  25. var panelBuffer = '<div class="mui-poppicker">\
  26. <div class="mui-poppicker-header" style="text-align:center">\
  27. <button class="mui-btn mui-poppicker-btn-cancel">取消</button>\
  28. <input style="height:30px;width:60%;color:black;margin-bottom:0px;" type="text" class="mui-poppicker-input" placeholder="查询..."></input>\
  29. <button class="mui-btn mui-btn-blue mui-poppicker-btn-ok">确定</button>\
  30. <div class="mui-poppicker-clear"></div>\
  31. </div>\
  32. <div class="mui-poppicker-body">\
  33. </div>\
  34. </div>';
  35. var pickerBuffer = '<div class="mui-picker">\
  36. <div class="mui-picker-inner">\
  37. <div class="mui-pciker-rule mui-pciker-rule-ft"></div>\
  38. <ul class="mui-pciker-list">\
  39. </ul>\
  40. <div class="mui-pciker-rule mui-pciker-rule-bg"></div>\
  41. </div>\
  42. </div>';
  43. //定义弹出选择器类
  44. var PopPicker = $.PopPicker = $.Class.extend({
  45. //构造函数
  46. init: function(options) {
  47. var self = this;
  48. self.options = options || {};
  49. self.options.buttons = self.options.buttons || ['取消', '确定'];
  50. self.panel = $.dom(panelBuffer)[0];
  51. document.body.appendChild(self.panel);
  52. self.ok = self.panel.querySelector('.mui-poppicker-btn-ok');
  53. self.cancel = self.panel.querySelector('.mui-poppicker-btn-cancel');
  54. self.body = self.panel.querySelector('.mui-poppicker-body');
  55. self.mask = $.createMask();
  56. self.cancel.innerText = self.options.buttons[0];
  57. self.ok.innerText = self.options.buttons[1];
  58. // Add By HaoYanbing 20171213 添加搜索功能
  59. self.searchInput = self.panel.querySelector('.mui-poppicker-input');
  60. self.searchInput.addEventListener('tap', function(event) {
  61. self.searchInput.focus();
  62. }, false);
  63. self.searchInput.addEventListener('input', function(event) {
  64. var searchText = self.searchInput.value;
  65. self.filterData(searchText);
  66. }, false);
  67. self.cancel.addEventListener('tap', function(event) {
  68. self.hide();
  69. }, false);
  70. self.ok.addEventListener('tap', function(event) {
  71. if (self.callback) {
  72. var rs = self.callback(self.getSelectedItems());
  73. if (rs !== false) {
  74. self.hide();
  75. }
  76. }
  77. }, false);
  78. self.mask[0].addEventListener('tap', function() {
  79. self.hide();
  80. }, false);
  81. self._createPicker();
  82. //防止滚动穿透
  83. self.panel.addEventListener($.EVENT_START, function(event) {
  84. event.preventDefault();
  85. }, false);
  86. self.panel.addEventListener($.EVENT_MOVE, function(event) {
  87. event.preventDefault();
  88. }, false);
  89. },
  90. _createPicker: function() {
  91. var self = this;
  92. var layer = self.options.layer || 1;
  93. var width = (100 / layer) + '%';
  94. self.pickers = [];
  95. for (var i = 1; i <= layer; i++) {
  96. var pickerElement = $.dom(pickerBuffer)[0];
  97. pickerElement.style.width = width;
  98. self.body.appendChild(pickerElement);
  99. var picker = $(pickerElement).picker();
  100. self.pickers.push(picker);
  101. pickerElement.addEventListener('change', function(event) {
  102. var nextPickerElement = this.nextSibling;
  103. if (nextPickerElement && nextPickerElement.picker) {
  104. var eventData = event.detail || {};
  105. var preItem = eventData.item || {};
  106. nextPickerElement.picker.setItems(preItem.children);
  107. }
  108. }, false);
  109. }
  110. },
  111. //填充数据
  112. setData: function(data) {
  113. var self = this;
  114. self.data = data || [];
  115. self.pickers[0].setItems(self.data);
  116. },
  117. //获取选中的项(数组)
  118. getSelectedItems: function() {
  119. var self = this;
  120. var items = [];
  121. for (var i = 0, len = self.pickers.length; i < len; i++) {
  122. var picker = self.pickers[i];
  123. items.push(picker.getSelectedItem() || {});
  124. }
  125. return items;
  126. },
  127. //显示
  128. show: function(callback) {
  129. var self = this;
  130. self.callback = callback;
  131. self.mask.show();
  132. document.body.classList.add($.className('poppicker-active-for-page'));
  133. self.panel.classList.add($.className('active'));
  134. //处理物理返回键
  135. self.__back = $.back;
  136. $.back = function() {
  137. self.hide();
  138. };
  139. },
  140. //隐藏
  141. hide: function() {
  142. var self = this;
  143. if (self.disposed) return;
  144. self.panel.classList.remove($.className('active'));
  145. self.mask.close();
  146. document.body.classList.remove($.className('poppicker-active-for-page'));
  147. //处理物理返回键
  148. $.back=self.__back;
  149. },
  150. dispose: function() {
  151. var self = this;
  152. self.hide();
  153. setTimeout(function() {
  154. self.panel.parentNode.removeChild(self.panel);
  155. for (var name in self) {
  156. self[name] = null;
  157. delete self[name];
  158. };
  159. self.disposed = true;
  160. }, 300);
  161. },
  162. // Add By HaoYanbing 20171213 过滤数据
  163. filterData: function(searchText){
  164. var self = this;
  165. if(self.data == undefined){
  166. return;
  167. }
  168. var newData = JSON.parse(JSON.stringify(self.data));
  169. var layer = self.options.layer || 1;
  170. // 根据layer获取最底级数据 调用deleteItem()
  171. function getBottomChildren(data, k){
  172. if(k < layer){
  173. data.forEach(function(item){
  174. if(item.children != undefined && item.children.length > 0){
  175. getBottomChildren(item.children, (k + 1));
  176. }
  177. })
  178. }else{
  179. deleteItem(data);
  180. }
  181. }
  182. getBottomChildren(newData, 1);
  183. // 删除不匹配的数据
  184. function deleteItem(data){
  185. for (var i = data.length - 1; i >= 0; i--) {
  186. var text = data[i].text || data[i];
  187. if(text.indexOf(searchText) < 0) {
  188. data.splice(i, 1);
  189. }
  190. }
  191. }
  192. // 删除子数据为空的父数据
  193. function deleteNullChildren(data, j){
  194. if(j < layer){
  195. for (var i = data.length - 1; i >= 0; i--) {
  196. if(data[i].children == undefined || data[i].children.length == 0){
  197. data.splice(i, 1);
  198. }else{
  199. deleteNullChildren(data[i].children, (j + 1));
  200. }
  201. }
  202. }
  203. }
  204. for(var n = 0; n < layer; n++){
  205. deleteNullChildren(newData, 1);
  206. }
  207. // 重新设置data
  208. self.pickers[0].setItems(newData);
  209. },
  210. });
  211. })(mui, document);