UNPKG

react-pickers

Version:

datapicker and citypicker base on MUI of picker

191 lines (175 loc) 5.63 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _mui = require('./mui'); var _mui2 = _interopRequireDefault(_mui); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } (function ($, document) { //创建 DOM $.dom = function (str) { if (typeof str !== 'string') { if (str instanceof Array || str[0] && str.length) { return [].slice.call(str); } else { return [str]; } } if (!$.__create_dom_div__) { $.__create_dom_div__ = document.createElement('div'); } $.__create_dom_div__.innerHTML = str; return [].slice.call($.__create_dom_div__.childNodes); }; var panelBuffer = '<div class="mui-poppicker">\ <div class="mui-poppicker-header">\ <button class="mui-btn mui-poppicker-btn-cancel">取消</button>\ <button class="mui-btn mui-btn-blue mui-poppicker-btn-ok">确定</button>\ <div class="mui-poppicker-clear"></div>\ </div>\ <div class="mui-poppicker-body">\ </div>\ </div>'; var pickerBuffer = '<div class="mui-picker pop-picker">\ <div class="mui-picker-inner">\ <div class="mui-pciker-rule mui-pciker-rule-ft"></div>\ <ul class="mui-pciker-list">\ </ul>\ <div class="mui-pciker-rule mui-pciker-rule-bg"></div>\ </div>\ </div>'; //定义弹出选择器类 var PopPicker = $.PopPicker = $.Class.extend({ //构造函数 init: function init(options) { var self = this; self.options = options || {}; self.options.buttons = self.options.buttons || ['取消', '确定']; self.panel = $.dom(panelBuffer)[0]; document.body.appendChild(self.panel); self.ok = self.panel.querySelector('.mui-poppicker-btn-ok'); self.cancel = self.panel.querySelector('.mui-poppicker-btn-cancel'); self.body = self.panel.querySelector('.mui-poppicker-body'); self.mask = $.createMask(); self.cancel.innerText = self.options.buttons[0]; self.ok.innerText = self.options.buttons[1]; self.ok.addEventListener('tap', function (event) { if (self.callback) { self.callback(self.getSelectedItems()); } }, false); self._createPicker(); //防止滚动穿透 self.panel.addEventListener($.EVENT_START, function (event) { event.preventDefault(); }, false); self.panel.addEventListener($.EVENT_MOVE, function (event) { event.preventDefault(); }, false); }, _createPicker: function _createPicker() { var self = this; var layer = self.options.layer || 1; var width = 100 / layer + '%'; self.pickers = []; for (var i = 1; i <= layer; i++) { var pickerElement = $.dom(pickerBuffer)[0]; pickerElement.style.width = width; self.body.appendChild(pickerElement); var picker = $(pickerElement).picker(); self.pickers.push(picker); pickerElement.addEventListener('change', function (event) { var nextPickerElement = this.nextSibling; if (nextPickerElement && nextPickerElement.picker) { var eventData = event.detail || {}; var preItem = eventData.item || {}; nextPickerElement.picker.setItems(preItem.children); } }, false); } //等选择数据初始化完后 再设定默认值 setTimeout(function () { //设定默认值 self.setSelectedValue(self.options.defaultVal); }, 100); }, //设置默认选中值 setSelectedValue: function setSelectedValue(value) { if (!value) return false; var self = this; var pickers = self.panel.querySelectorAll('.pop-picker'); pickers = Array.prototype.slice.call(pickers); set(pickers, value); //设置 function set(pickers, value) { if (value.length) { var val = value.shift(); var pickerObj = pickers.shift(); pickerObj.picker.setSelectedValue(val, 0, function (pickers, value) { setTimeout(function () { set(pickers, value); }, 200); }.bind(this, pickers, value)); } } }, //填充数据 setData: function setData(data) { var self = this; data = data || []; self.pickers[0].setItems(data); }, //获取选中的项(数组) getSelectedItems: function getSelectedItems() { var self = this; var items = []; for (var i in self.pickers) { var picker = self.pickers[i]; items.push(picker.getSelectedItem() || {}); } return items; }, //显示 show: function show(callback) { var self = this; self.callback = callback; self.mask.show(); document.body.classList.add($.className('poppicker-active-for-page')); self.panel.classList.add($.className('active')); //处理物理返回键 self.__back = $.back; $.back = function () { self.hide(); }; }, //隐藏 hide: function hide() { var self = this; if (self.disposed) return; self.panel.classList.remove($.className('active')); self.mask.close(); document.body.classList.remove($.className('poppicker-active-for-page')); //处理物理返回键 $.back = self.__back; }, dispose: function dispose() { var self = this; self.hide(); setTimeout(function () { self.panel.parentNode.removeChild(self.panel); for (var name in self) { self[name] = null; delete self[name]; }; self.disposed = true; }, 300); } }); })(_mui2.default, document); /** * 弹出选择列表插件 * 此组件依赖 listpcker ,请在页面中先引入 mui.picker.css + mui.picker.js * varstion 1.0.1 * by Houfeng * Houfeng@DCloud.io */ exports.default = _mui2.default.PopPicker;