窗口就当是返回了主页面,在当前窗口触发\r\n nowDoc = window.document;\r\n } else {\r\n nowDoc = iframe[0].contentDocument;\r\n }\r\n\r\n if (zeroPage) {\r\n pagesObj.addClass(zeroPagesClass);\r\n }\r\n\r\n var evt = nowDoc.createEvent('Event');\r\n evt.initEvent(eventName, true, true);\r\n if (option.data) {\r\n evt.data = option.data;\r\n }\r\n nowDoc.body.dispatchEvent(evt);\r\n if (option.callBack) {\r\n option.callBack();\r\n }\r\n }\r\n\r\n if (option.animate) {\r\n animatePage.addClass(animateOutClass).animationEnd(end);\r\n } else {\r\n end();\r\n }\r\n };\r\n\r\n // 往前关闭窗口\r\n page.closePage = function (option) {\r\n var closeIndex = option.closeIndex;\r\n var prevPage = $(\".ipu-page.ipu-show\", pagesObj).prevAll(\".ipu-page\");\r\n\r\n if (option.pageName) {\r\n closeIndex = $(\".ipu-page[data-name='\" + option.pageName + \"']:first\", pagesObj).index();\r\n } else if (closeIndex < 0) {\r\n closeIndex = -closeIndex - 1;\r\n } else {\r\n closeIndex = prevPage.size() - closeIndex;\r\n }\r\n\r\n $(prevPage[closeIndex]).remove();\r\n if (option.callBack) {\r\n option.callBack();\r\n }\r\n };\r\n\r\n /**\r\n * get请求的方式加载页面\r\n *\r\n * @param {String} url\r\n * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n */\r\n page.open = function (url, option) {\r\n option = $.extend({}, this.defaultOption, option);\r\n option.target.ipuUI.page.openPage(url, option);\r\n };\r\n\r\n /**\r\n * 使用post方式加载一个新页面\r\n *\r\n * @param {String} url 要打开的页面地址\r\n * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n */\r\n page.post = function (url, option) {\r\n option = $.extend({}, this.defaultOption, option);\r\n option.method = 'post';\r\n option.target.ipuUI.page.openPage(url, option);\r\n };\r\n\r\n /**\r\n * 回退到某个历史页面,可以根据pageName回退,也可根据backIndex回退,默认回退上一个页面\r\n *\r\n * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n */\r\n page.back = function (option) {\r\n option = $.extend({}, this.defaultOption, option);\r\n option.target.ipuUI.page.backPage(option);\r\n };\r\n\r\n /**\r\n * 回退到首页\r\n *\r\n * @param {Object} option 回退参数,见{@link #cfg-defaultOption}\r\n */\r\n page.backHome = function (option) {\r\n option = option || {};\r\n option.backIndex = 0;\r\n page.back(option);\r\n };\r\n\r\n // 子窗口,待确认\r\n page.close = function (option) {\r\n option = $.extend({}, this.defaultOption, option);\r\n option.target.ipuUI.page.closePage(option);\r\n };\r\n\r\n /**\r\n * 给页面增加一个监听,从其它页面回退到此页面,调用此函数,可以接收其它页面传来的数据\r\n *\r\n * @param {Function} back 监听函数\r\n * @param back.data 其它页面传过来的参数,推荐字符串或Json对象\r\n */\r\n page.onBack = function (back) {\r\n $(\"body\").on(eventName, function (e) {\r\n var data = e.originalEvent.data;\r\n back(data);\r\n });\r\n };\r\n\r\n // 提供一个关闭一群窗口的方法\r\n ipuUI.page = page;\r\n})(ipuUI || window, jQuery);\r\n\n// picker\r\n(function (ipuUI, $, Hammer) {\r\n var showItemSize = 9; // 显示的子项数量,\r\n var r = 90; // 计算旋转的圆半径,结果应该缩小,是为了r不要距离容器太近,是否不应该设置px,使用rem\r\n var itemAngle = 180 / showItemSize; // 每项对应的角度是 180/9 = 20\r\n var maxExceed = itemAngle; // 滚动时允许超出边界的最大角度,允许最多翻过一项\r\n // itemHeight = 40px;每项数据的高度设置 // 需要给出r=89是怎么计算出来的,是根据 40/2/Math.tan(40/2/180*Math.PI)=113,直接太大不好看\r\n\r\n\r\n function toRem(num) {\r\n return num / 100;\r\n }\r\n\r\n /**\r\n * @private\r\n * @class 选择器,被DtPicker和PopPicker使用,实现选择与滚动等基础功能\r\n *\r\n * @constructor 初始化方法\r\n * @param {String|DOM|JQueryObj} slt\r\n * @param {object} option 组件参数,默认配置见 {@link #cfg-defaultOption}\r\n */\r\n function Picker(slt, option) {\r\n this.el = $(slt)[0];\r\n this.option = $.extend({}, this.defaultOption, option);\r\n this._init();\r\n }\r\n\r\n /**\r\n * 组件默认配置项\r\n *\r\n * @cfg {Object} defaultOption=\r\n * @cfg {Boolean} defaultOption.listen=true 是否需要监听变化\r\n * @cfg {[Object]} defaultOption.data=[] 可选择项数组,每个项须有text属性\r\n * @cfg {String} defaultOption.data.text 子项展示文本\r\n * @cfg {Function} defaultOption.onChange=null 选择变化时的回调函数\r\n * @cfg {Object} defaultOption.onChange.sltItem 选中项\r\n * @cfg {Number} defaultOption.onChange.newIndex 新的选中项索引\r\n * @cfg {Number} defaultOption.onChange.oldIndex 旧的选中项索引\r\n * @cfg {Boolean} defaultOption.onChange.newData 是否为调用setItem()方法触发\r\n */\r\n Picker.prototype.defaultOption = {\r\n listen: true,\r\n data: [],\r\n onChange: null\r\n };\r\n\r\n Picker.prototype._init = function () {\r\n var self = this;\r\n this.wrap = $(\">ul\", this.el);\r\n this.index = null; // 选中项索引\r\n this.listen = !!this.option.listen;\r\n\r\n this.beginAngle = 0; // 开始角度\r\n this.beginExceed = this.beginAngle - maxExceed; // 最小角度值\r\n this.stopInertiaMove = false;\r\n this.lastAngle = null; // 保存滑动前的角度 // 当前滚动的角度\r\n\r\n // 如果是ios,则ul的旋转中心点,样式不同于android\r\n if (ipuUI.device.ios) {\r\n this.wrap.css(\"transform-origin\", \"center center \" + toRem(r) + \"rem\"); //如果是ios,要变更旋转的中心点\r\n }\r\n\r\n\r\n this.setItems(this.option.data);\r\n\r\n this.hammer = new Hammer.Manager(this.el);\r\n this.hammer.add(new Hammer.Pan({direction: Hammer.DIRECTION_VERTICAL, threshold: 5}));\r\n this.hammer.add(new Hammer.Press({threshold: 4})); //\r\n this.hammer.on(\"panstart panmove panend pancancel\", Hammer.bindFn(this._onPan, this));\r\n\r\n // 处理滚动中,用户点中某项,停止\r\n this.hammer.on(\"press pressup\", function (e) { // 如果用户点击了,是停止自动滚动\r\n if (this.empty) {\r\n return;\r\n }\r\n\r\n self.stopInertiaMove = true;\r\n if (e.type == 'pressup') {\r\n self.endScroll();\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * 设置选择项\r\n *\r\n * @param {[Object]} data 设置项数组\r\n */\r\n Picker.prototype.setItems = function (data, textName) { // textNam字体暂不支持\r\n this.wrap.empty(); // 清空历史数据\r\n this.data = data = data || [];\r\n this.empty = data.length == 0; // 数据是否为空\r\n\r\n this.newData = true; // 是否为新设置数据标记\r\n var self = this;\r\n var lis = \"\";\r\n textName = textName || 'text';\r\n\r\n for (var i = 0, j = data.length; i < j; i++) {\r\n lis = lis + \"<li>\" + data[i][textName] + \"</li>\";\r\n }\r\n\r\n $(lis).appendTo(this.wrap);\r\n\r\n this.items = $(\">li\", this.wrap);\r\n this.itemsSize = this.items.size();\r\n\r\n this.endAngle = (this.empty ? 0 : this.itemsSize - 1) * itemAngle;\r\n this.endExceed = this.endAngle + maxExceed; // 最大旋转角度值\r\n\r\n // 初始化各子项角度\r\n this.items.each(function (i) {\r\n $(this).css({\r\n \"transform\": \"translateZ(\" + toRem(r) + \"rem) rotateX(-\" + (i * itemAngle) + \"deg)\",\r\n \"transform-origin\": \"center center -\" + toRem(r) + \"rem\"\r\n });\r\n $(this).click(function () {\r\n self.stopInertiaMove = true;\r\n self.setAngle(i * itemAngle, true);\r\n })\r\n });\r\n\r\n var newAngle;\r\n if (this.empty || this.index == null) {\r\n newAngle = 0;\r\n } else {\r\n if (this.index > this.itemsSize - 1) { // 取最大值\r\n newAngle = (this.itemsSize - 1) * itemAngle;\r\n } else {\r\n newAngle = this.index * itemAngle;\r\n }\r\n }\r\n this.setAngle(newAngle, true);\r\n };\r\n\r\n Picker.prototype._onPan = function (ev) {\r\n if (this.empty) {\r\n return;\r\n }\r\n\r\n //console.log(ev.deltaX + \"==\"+ ev.deltaY);\r\n if (ev.type == 'panstart') { // 好像一定要移动才有startg事件\r\n self.stopInertiaMove = true;\r\n this.lastAngle = this.angle;\r\n this.wrap.addClass(\"ipu-noanimate\"); // 移除动画\r\n this.stopInertiaMove = true; // 停止自动减速滚动\r\n\r\n } else if (ev.type == 'panmove') {\r\n var moveAngle = this.calcAngle(ev.deltaY);\r\n var newAngle = this.lastAngle - moveAngle; //最新的角度\r\n //console.log('=='+newAngle);\r\n // 一个可以转动的最小值和最大值过滤\r\n if (newAngle < this.beginExceed) {\r\n newAngle = this.beginExceed;\r\n }\r\n if (newAngle > this.endExceed) {\r\n newAngle = this.endExceed;\r\n }\r\n this.setAngle(newAngle);\r\n\r\n } else { // end or cancel事件\r\n // console.log('end or cancel:' + ev.type);\r\n var v = ev.overallVelocityY; // 滑动的速度\r\n var dir = v > 0 ? -1 : 1; //加速度方向\r\n var deceleration = dir * 0.0006 * -1;\r\n var duration = Math.abs(v / deceleration); // 速度消减至0所需时间\r\n var dist = v * duration / 2; //最终移动多少\r\n\r\n var startAngle = this.angle;\r\n var distAngle = -this.calcAngle(dist);\r\n // console.log(\"dist=\" + dist + \", distAngle\" + distAngle);\r\n\r\n //----\r\n var srcDistAngle = distAngle;\r\n if (startAngle + distAngle < this.beginExceed) {\r\n distAngle = this.beginExceed - startAngle;\r\n duration = duration * (distAngle / srcDistAngle) * 0.6;\r\n }\r\n if (startAngle + distAngle > this.endExceed) {\r\n distAngle = this.endExceed - startAngle;\r\n duration = duration * (distAngle / srcDistAngle) * 0.6;\r\n }\r\n\r\n if (distAngle == 0) {\r\n this.endScroll();\r\n return;\r\n }\r\n this.scrollDistAngle(startAngle, distAngle, duration);\r\n }\r\n };\r\n\r\n // 计算移动的角度,转动的角度,就是移动的距离对应相关圆周\r\n // 2*r*PI = 360, angle = 360*c/(2*r*PI)\r\n var ca = 360 / (2 * r * Math.PI);\r\n Picker.prototype.calcAngle = function (c) {\r\n return c * ca;\r\n };\r\n\r\n /**\r\n * 为组件设置新的滚动角度\r\n *\r\n * @param {Number} newAngle 新的滚动角度\r\n * @param {Boolean} endScroll 是否为最终滚动角度,为最终滚动角度时,若索引更新可以触发onChange的回调\r\n */\r\n Picker.prototype.setAngle = function (newAngle, endScroll) {\r\n this.angle = newAngle; // 存储最新值\r\n this.wrap.css(\"transform\", \"perspective(\" + toRem(1000) + \"rem) rotateY(0deg) rotateX(\" + newAngle + \"deg)\");\r\n this.calcItemVisable(newAngle);\r\n\r\n if (endScroll) {\r\n var index = newAngle / itemAngle;\r\n var oldIndex = this.index;\r\n this.index = this.empty ? null : index; // 这里可以做一个判断,如果是empty,则index值可以不改变\r\n\r\n // 这个地方要判断下,数据更新或索引更新都要触发\r\n if (oldIndex != index || this.newData) {\r\n if (this.option.onChange && this.listen) {\r\n this.option.onChange(this.getSelectedItem(), this.index, oldIndex, this.newData);\r\n }\r\n this.newData = false;\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * 计算各子项滚动角度与新的滚动角度的值差异来决定显示的情况\r\n * 角度大于 90-(itemAngle/2)时,隐藏\r\n * 角度小于itemAngle/2表示最中心的项,显示并高亮\r\n * 其它值则表示此项为显示\r\n *\r\n * @param {Number} angle 新的滚动角度\r\n */\r\n Picker.prototype.calcItemVisable = function (angle) {\r\n this.items.each(function (index) {\r\n var difference = Math.abs(index * itemAngle - angle);\r\n\r\n if (difference < itemAngle / 2) {\r\n $(this).addClass(\"ipu-highlight ipu-visible\");\r\n } else if (difference >= (90 - itemAngle / 2)) { // 距离不能超过90度\r\n $(this).removeClass(\"ipu-highlight ipu-visible\");\r\n } else {\r\n $(this).addClass(\"ipu-visible\").removeClass(\"ipu-highlight\");\r\n }\r\n });\r\n };\r\n\r\n // 设置最后回归位置\r\n Picker.prototype.endScroll = function () {\r\n this.wrap.removeClass(\"ipu-noanimate\");\r\n var endAngle;\r\n\r\n if (this.angle < this.beginAngle) {\r\n endAngle = this.beginAngle;\r\n } else if (this.angle > this.endAngle) {\r\n endAngle = this.endAngle;\r\n } else {\r\n var index = parseInt((this.angle / itemAngle).toFixed(0));\r\n endAngle = (itemAngle * index);\r\n }\r\n\r\n this.setAngle(endAngle, true);\r\n };\r\n\r\n // 进行惯性滚动\r\n Picker.prototype.scrollDistAngle = function (startAngle, distAngle, duration) {\r\n var self = this;\r\n var nowTime = new Date().getTime();\r\n this.stopInertiaMove = false;\r\n duration = 1 * duration; // 滚动时长控制修改\r\n\r\n // hammer调用的惯性函数\r\n (function (nowTime, startAngle, distAngle, duration) {\r\n var frameInterval = 13;\r\n var stepCount = duration / frameInterval;\r\n var stepIndex = 0;\r\n\r\n (function inertiaMove() {\r\n if (self.stopInertiaMove) return;\r\n var newAngle = self.quartEaseOut(stepIndex, startAngle, distAngle, stepCount);\r\n self.setAngle(newAngle);\r\n stepIndex++;\r\n\r\n if (stepIndex > stepCount - 1 || newAngle < self.beginExceed || newAngle > self.endExceed) {\r\n self.endScroll();\r\n return;\r\n }\r\n\r\n setTimeout(inertiaMove, frameInterval);\r\n })();\r\n\r\n })(nowTime, startAngle, distAngle, duration);\r\n };\r\n\r\n /**\r\n * 设置是否监听触发onChange回调\r\n *\r\n * @param {Boolean} listen\r\n */\r\n Picker.prototype.setListen = function (listen) {\r\n this.listen = !!listen;\r\n };\r\n\r\n Picker.prototype.quartEaseOut = function (t, b, c, d) {\r\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\r\n };\r\n\r\n /**\r\n * 设置选中项,若子项的value属性为value,则设置该项为选中项\r\n *\r\n * @param value\r\n */\r\n Picker.prototype.setSelectedValue = function (value) {\r\n var self = this;\r\n for (var index in self.data) {\r\n var item = self.data[index];\r\n if (item.value == value) {\r\n self.setAngle(index * itemAngle, true);\r\n return;\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * 获取选中的子项,若子项集为空时,返回空对象\r\n *\r\n * @returns {Object}\r\n */\r\n Picker.prototype.getSelectedItem = function () {\r\n return this.empty ? {} : this.data[this.index];\r\n };\r\n\r\n /**\r\n * 获取选中的子项的value属性\r\n * @returns\r\n */\r\n Picker.prototype.getSelectedValue = function () {\r\n return this.getSelectedItem().value;\r\n };\r\n\r\n /**\r\n * 返回选中项的text属性\r\n * @return {String}\r\n */\r\n Picker.prototype.getSelectedText = function () {\r\n return this.getSelectedItem().text;\r\n };\r\n\r\n /**\r\n * 获取选中项的索引,若子项集为空则返回null\r\n * @returns {Number}\r\n */\r\n Picker.prototype.getSelectedIndex = function () {\r\n return this.index;\r\n };\r\n\r\n ipuUI.Picker = Picker;\r\n\r\n})(ipuUI || window, jQuery, Hammer);\r\n\n// popPicker\r\n(function (ipuUI, $) {\r\n var Picker = ipuUI.Picker;\r\n\r\n /**\r\n * @class\r\n * 原生select的替代实现,适应数据较多或级联的情况\r\n *\r\n * @example\r\n * // 配置项data的数据结构\r\n * var data = [{text:'显示名称', value:''}...];\r\n *\r\n * // layer=1的数据结构\r\n * var data-1 = [{text:'湖南', value:'HN'}, {text:'湖北', value:'HB'}];\r\n *\r\n * // layer=2时的数据结构,有额外data属性存放下一层级数据\r\n * var data-1 = [{\r\n * text:'湖南',value:'HN', data:[{text:'长沙', value:'CS'}, {text:'湘谭', value:'XT'}]\r\n * },{\r\n * text:'湖北',value:'HB', data:[{text:'武汉', value:'WH'}, {text:'天门', value:'TM'}]\r\n * }\r\n * ];\r\n\r\n *\r\n * @constructor 不能直接访问该类,调用{@link ipuUI.popPicker(slt, option)}生成实例\r\n * @param {String|jqueryObj} slt\r\n * jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n */\r\n function PopPicker(option) {\r\n this.option = $.extend({}, this.defaultOption, option);\r\n if (!Picker) {\r\n Picker = ipuUI.Picker;\r\n }\r\n this._init();\r\n }\r\n\r\n PopPicker.prototype._init = function () {\r\n this.holder = $(this.option.template).appendTo(\"body\");\r\n var bodyHtml = $(\".ipu-poppicker-body\", this.holder);\r\n\r\n var layer = this.option.layer;\r\n var width = (100 / layer) + \"%\";\r\n this.pickers = new Array(layer);\r\n var self = this;\r\n var pickerHtml;\r\n this.mask = this.createMask();\r\n\r\n // 先初始化最底层picerk,再上面来\r\n for (var i = layer - 1; i >= 0; i--) {\r\n pickerHtml = $(this.option.pickerTemplate).prependTo(bodyHtml).css({width: width});\r\n\r\n this.pickers[i] = new Picker(pickerHtml, {\r\n onChange: (function (i) {\r\n return function (item) { // 更新底部的值\r\n if (i != layer - 1) {\r\n self.pickers[i + 1].setItems(item.data);\r\n }\r\n };\r\n })(i)\r\n });\r\n }\r\n\r\n $(\".ipu-poppicker-btn-ok\", this.holder).click(function () {\r\n var rs = self.getSelectItems();\r\n if (self.option.callBack(rs) !== false) {\r\n self.hide();\r\n }\r\n }).text(this.option.btns[1]);\r\n\r\n $(\".ipu-poppicker-btn-cancel\", this.holder).click(function () {\r\n self.hide();\r\n }).text(this.option.btns[0]);\r\n };\r\n\r\n /**\r\n * 组件默认配置项\r\n *\r\n * @cfg {Object} defaultOption\r\n * @cfg {String} defaultOption.template html结构\r\n * @cfg {String} defaultOption.pickerTemplate 内容dom选择器\r\n * @cfg {Object[]} defaultOption.data 选择项数据\r\n * @cfg {String} defaultOption.data.text 子项展示文本\r\n * @cfg {*} defaultOption.data.value 子项值\r\n * @cfg {Object[]} defaultOption.data.data 有更多层级时,此属性存放下一层级的数据\r\n * @cfg {Number} defaultOption.layer=1 数据层数\r\n * @cfg {String[]} defaultOption.btns=['取消', '确认'] 按钮文本\r\n * @cfg {Function} defaultOption.callBack=null 回调函数\r\n */\r\n PopPicker.prototype.defaultOption = {\r\n template: '<div class=\"ipu-poppicker\">'\r\n + '<div class=\"ipu-poppicker-header\">'\r\n + '<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-cancel\">取消</button>'\r\n + '<button class=\"ipu-btn ipu-btn-s ipu-poppicker-btn-ok\">确定</button>'\r\n + '</div>'\r\n + '<div class=\"ipu-poppicker-body\">'\r\n + '</div>'\r\n + '</div>',\r\n pickerTemplate: '<div class=\"ipu-picker\">'\r\n + '<div class=\"ipu-picker-selectbox\"></div>'\r\n + '<ul></ul>'\r\n + '</div>',\r\n data: [], // 数据\r\n layer: 1, // 数据层级\r\n btns: ['取消', '确认'],\r\n callBack: function () { // 选择数据时的回调函数\r\n\r\n }\r\n };\r\n\r\n /**\r\n * 设置选择项数据\r\n *\r\n * @param{[Object]} data 选择项数组\r\n * @param {String} data.text 每个选择项的文本\r\n * @param {[Object]} data.data 如果有多层选择的话,应该有一个data属性\r\n */\r\n PopPicker.prototype.setData = function (data) {\r\n this.pickers[0].setItems(data);\r\n };\r\n\r\n /**\r\n * 显示选择器\r\n *\r\n * @param callBack\r\n */\r\n PopPicker.prototype.show = function (callBack) {\r\n if (callBack) {\r\n this.option.callBack = callBack;\r\n }\r\n this.mask.show();\r\n this.holder.addClass(\"ipu-current\");\r\n };\r\n\r\n /**\r\n * 隐藏选择器\r\n */\r\n PopPicker.prototype.hide = function () {\r\n this.mask.close();\r\n this.holder.removeClass(\"ipu-current\");\r\n };\r\n\r\n /**\r\n * 获取用户选择的项,如果配置项layer为1,则直接返回选择项,\r\n * 否则返回一个数组返回每层选中的项\r\n *\r\n */\r\n PopPicker.prototype.getSelectItems = function () {\r\n if (this.option.layer == 1) {\r\n return this.pickers[0].getSelectedItem();\r\n } else {\r\n var rs = [];\r\n for (var i = 0; i < this.option.layer; i++) {\r\n rs.push(this.pickers[i].getSelectedItem());\r\n }\r\n return rs;\r\n }\r\n };\r\n\r\n // 应该移除callback参数,提取出业成一个工具方法\r\n PopPicker.prototype.createMask = function (callback) {\r\n var self = this;\r\n var element = document.createElement('div');\r\n element.classList.add(\"ipu-picker-backup\");\r\n //element.addEventListener($.EVENT_MOVE, $.preventDefault);\r\n element.addEventListener('click', function () {\r\n self.hide();\r\n });\r\n var mask = [element];\r\n mask._show = false;\r\n mask.show = function () {\r\n mask._show = true;\r\n element.setAttribute('style', 'opacity:1');\r\n document.body.appendChild(element);\r\n return mask;\r\n };\r\n mask._remove = function () {\r\n if (mask._show) {\r\n mask._show = false;\r\n element.setAttribute('style', 'opacity:0');\r\n setTimeout(function () {\r\n var body = document.body;\r\n element.parentNode === body && body.removeChild(element);\r\n }, 350);\r\n }\r\n return mask;\r\n };\r\n mask.close = function () {\r\n if (mask._show) {\r\n if (callback) {\r\n if (callback() !== false) {\r\n mask._remove();\r\n }\r\n } else {\r\n mask._remove();\r\n }\r\n }\r\n };\r\n return mask;\r\n };\r\n\r\n /**\r\n * @member ipuUI\r\n * 生成PopPicker实例,参数信息见{@link PopPicker#method-constructor}\r\n *\r\n * @param {String} slt\r\n * @param {Object} option\r\n * @returns {PopPicker}\r\n */\r\n ipuUI.popPicker = function (option) {\r\n return new PopPicker(option);\r\n };\r\n\r\n})(ipuUI || window, jQuery);\r\n\n(function (ipuUI, $) {\r\n\r\n /**\r\n * @class\r\n * 进度条\r\n *\r\n * @example\r\n * <!-- 组件html -->\r\n * <div class=\"ipu-progress \">\r\n * <span class=\"ipu-progressbar\"></span>\r\n * </div>\r\n *\r\n *\r\n * @constructor 不能直接访问该类,调用 {@link ipuUI#progressBar}生成实例\r\n * @param {String|jqueryObj} slt\r\n * jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n * @param {Object} option 组件配置参数,默认配置见 {@link #cfg-defaultOption}\r\n */\r\n function ProgressBar(id, option) {\r\n this.id = id;\r\n this.level = option.level;\r\n this.progress = option.progress;\r\n this.progressBar = $(id).eq(0);\r\n\r\n if (option.progress != null) {\r\n this.setProgress(this.progress);\r\n }\r\n if (option.level != null) {\r\n this.setLevel(this.level);\r\n }\r\n }\r\n\r\n /**\r\n * @cfg defaultOption 刷新组件默认配置\r\n * @cfg {default|warning|highlight|success} defaultOption.level='default' 级别,显示颜色\r\n * @cfg {Number} defaultOption.progress=null 当前进度百分比\r\n *\r\n */\r\n\r\n /**\r\n * 设置百分进度\r\n *\r\n * @param {Number} pro\r\n */\r\n ProgressBar.prototype.setProgress = function (pro) {\r\n if (pro < 0 || pro > 100) return;\r\n\r\n $(this.progressBar.find(\".ipu-progressbar\")).css(\"transform\", \"translate3d(\" + (-(100 - pro)) + \"%, 0px, 0px)\");\r\n this.progress = pro;\r\n };\r\n\r\n /**\r\n * 获取百分进度\r\n *\r\n * @returns {Number|*}\r\n */\r\n ProgressBar.prototype.getProgress = function () {\r\n return this.progress;\r\n };\r\n\r\n /**\r\n * 设置进度条级别\r\n *\r\n * @param {default | success | highlight | warning} level\r\n */\r\n ProgressBar.prototype.setLevel = function (level) {\r\n if (level == \"default\") {\r\n $(this.progressBar).removeClass(\"ipu-progressbar-success ipu-progressbar-hightlight ipu-progressbar-warning\");\r\n $(this.progressBar).addClass(\"ipu-progress\");\r\n } else if (level == \"success\") {\r\n $(this.progressBar).removeClass(\"ipu-progressbar-highlight ipu-progressbar-warning\");\r\n $(this.progressBar).addClass(\"ipu-progressbar-success\");\r\n } else if (level == \"highlight\") {\r\n $(this.progressBar).removeClass(\"ipu-progressbar-success ipu-progressbar-warning\");\r\n $(this.progressBar).addClass(\"ipu-progressbar-highlight\");\r\n } else if (level == \"warning\") {\r\n $(this.progressBar).removeClass(\"ipu-progressbar-success ipu-progressbar-highlight\");\r\n $(this.progressBar).addClass(\"ipu-progressbar-warning\");\r\n }\r\n };\r\n\r\n /**\r\n * @member ipuUI\r\n * 生成PopPicker实例,参数信息见{@link ProgressBar#method-constructor}\r\n *\r\n * @param {String} slt\r\n * @param {Object} option\r\n * @returns {ProgressBar}\r\n */\r\n ipuUI.progressBar = function (slt, option) {\r\n return new ProgressBar(slt, option);\r\n };\r\n})(ipuUI || window, jQuery);\r\n\n// 设置上下条件长度,或计算函数\r\n// 处理resize的问题,用户主动调用refresh??\r\n// 底部启用或停用时,应该刷新组件iscroll高度\r\n// 顶部正在加载时,自动停止底端加载状态,停用底部加载,停用底部加载时,可以不隐藏,变性成显示不见,或者隐藏,然后修改iscroll参数\r\n\r\n(function (ipuUI, $, iScroll) {\r\n /**\r\n * @class\r\n * 通过IScroll.js实现上拉下拉加载\r\n *\r\n * @example\r\n * <!-- 组件html结构,最外层div应有一个固定的高度,会在此元素上初始化iScroll -->\r\n * <div>\r\n * <div class=\"ipu-refresh-wrapper\">\r\n * <!-- 此处组件初始化后,会添加上拉html -->\r\n * <div class=\"refresh-content\">\r\n * 内容区...\r\n * </div>\r\n * <!-- 此处组件初始化后,会添加下拉html -->\r\n * </div>\r\n * </div>\r\n *\r\n * @uses IScroll.js\r\n *\r\n * @constructor 不能直接访问该类,调用ipuUI.refresh(slt, option)生成实例\r\n * @param {String|JqueryObj|Dom} slt\r\n * jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n * @param {Object} option\r\n * 组件参数\r\n */\r\n function Refresh(slt, option) {\r\n this.option = $.extend({}, this.defaultOption, option);\r\n this.el = $(slt).get(0);\r\n this._initBottomAndTop();\r\n var me = this;\r\n\r\n this.iScrollOption = {\r\n onScrollMove: function (e) {\r\n if (me.topEnable && !me.topLoading) { // 顶部是松手才加载\r\n if (this.y >= me.topPullOffset && !me.topEl.hasClass('ipu-refresh-toload')) { // 达到刷新距离,更新显示状态\r\n me.topEl.addClass('ipu-refresh-toload');\r\n } else if (this.y < me.topPullOffset && me.topEl.hasClass('ipu-refresh-toload')) { // 从达到刷新距离更新为未达到距离,更新显示状态\r\n me.topEl.removeClass('ipu-refresh-toload');\r\n }\r\n }\r\n\r\n me._checkBottomLoading(); // 底部加载条件和顶部条件不一样,只要滚动离底部一定高度就开始加载\r\n me.goTop = this.y > me.topPullOffset; // 记录是否位于顶部位置,以便刷新后可以回到此位置\r\n },\r\n onBeforeScrollEnd: function () { // 一定是用户拖动触发,在滚动结束前应该触发\r\n me._checkTopLoading();\r\n me._checkBottomLoading();\r\n },\r\n onScrollEnd: function () { // 这个事件可能由非用户拖动时触发,可能是拖动惯性导致,所有顶部不应该处理,但顶部不管是否惯性,位置条件满足即触发\r\n if (me.topLoading && this.y < this.minScrollY && me.goTop) {\r\n me.iScroll.scrollTo(0, this.minScrollY, 0);\r\n }\r\n me._checkBottomLoading(); // 在beforend执行还不够,还在要end执行\r\n },\r\n onRefresh: function () { // 刷新时,若顶部加载还在进行,且当前显示的顶部加载,则继续显示,否则刷新后会消失顶部加载,这里代码没有考虑重用了,应该可以做一步提取\r\n if (me.topLoading) { // 如果顶部在加载,则刷新的时候,设置最小顶部距离,显示顶部加载状态\r\n this.minScrollY = this.minScrollY + me.topPullOffset;\r\n }\r\n }\r\n };\r\n\r\n this.iScrollOption = $.extend({}, this.option.iScrollOption, this.iScrollOption);\r\n this.iScroll = new iScroll(this.el, this.iScrollOption);\r\n this._checkContentLoading();\r\n }\r\n\r\n /**\r\n * @cfg defaultOption 刷新组件默认配置\r\n * @cfg {Function} defaultOption.bottomLoadFun=null 上拉时,触发底加载的响应函数\r\n * @cfg {Function} defaultOption.topLoadFun=null 下拉时,触发顶部加载的响应函数\r\n * @cfg {Boolean} defaultOption.initEnableTop=true 初始化时,是否启用顶部加载功能\r\n * @cfg {Boolean} defaultOption.initEnableBottom=true 初始化时,是否启用底部加载功能\r\n * @cfg {String} defaultOption.bottomLoadHtml=... 底部加载时显示的html片段,不建议变动\r\n * @cfg {String} defaultOption.topLoadHtml=... 顶部加载时显示的html片段,不建议变动\r\n * @cfg {Number} defaultOption.bottomAddLen=0 距离底部多远时,触发底部加载\r\n *\r\n */\r\n Refresh.prototype.defaultOption = {\r\n bottomLoadFun: null, // 底部加载处理函数\r\n topLoadFun: null, // 顶部加载处理函数\r\n initEnableTop: true, // 初始时启用刷新,有时用户并不想启用\r\n initEnableBottom: true, // 初始时启用加载更多,用时用户并不想启用\r\n bottomLoadHtml: '<div class=\"ipu-refresh-bottom\"><span class=\"ipu-refresh-loading\"></span></div>', // 默认底部加载显示内容\r\n topLoadHtml: '<div class=\"ipu-refresh-top\"><span class=\"ipu-refresh-loading\"></span><div class=\"ipu-refresh-arrow\"></div></div>',\r\n // 默认顶部加载显示内容,最上层节点class有下面三个阶段变化\r\n // 默认阶段,不是顶部加载状态时,且拖动时未达到加载距离,无特殊class,移除ipu-refresh-top-loading\r\n // 拖动达到加载距离,则增加class:ipu-refresh-toload\r\n // 加载中,则增加class:ipu-refresh-top-loading,移除class:ipu-refresh-toload\r\n bottomAddLen: 0, // 底部提前加载距离,单位px\r\n iScrollOption: {} // 主要是用来接收外面一些函数,不能传递回调的相关函数如refresh,也可在本地函数调用完后,再调用参数的函数,不推荐\r\n };\r\n\r\n Refresh.prototype._initBottomAndTop = function () {\r\n this.scrollEl = $(\">.ipu-refresh-wrapper\", this.el);\r\n this.bottomEl = $(this.option.bottomLoadHtml).appendTo(this.scrollEl);\r\n this.topEl = $(this.option.topLoadHtml).prependTo(this.scrollEl);\r\n\r\n this.topPullOffset = this.topEl.outerHeight();\r\n this.bottomPullOffset = this.bottomEl.outerHeight() + this.option.bottomAddLen; // 增加100;最好配一个额外参数\r\n\r\n /** @property {Boolean} 顶部是否加载中 */\r\n this.topLoading = false; // 顶部正在载加载\r\n\r\n /** @property {Boolean} 底部是否加载中 */\r\n this.bottomLoading = false; // 底部正在加载\r\n\r\n /** @property {Boolean} 底部是否可加载 */\r\n this.bottomEnable = this.option.initEnableBottom && !!this.option.bottomLoadFun;\r\n\r\n /** @property {Boolean} 顶部是否可加载 */\r\n this.topEnable = this.option.initEnableTop && !!this.option.topLoadFun;\r\n\r\n this.goTop = false; // 用来处理,因为iScroll使用momentum(惯性), 导致有时顶部显示不正确问题,true表示顶部显示加载条\r\n\r\n this.enableBottom(this.bottomEnable);\r\n this.enableTop(this.topEnable);\r\n };\r\n\r\n // 检查是否需要底部加载\r\n Refresh.prototype._checkBottomLoading = function () {\r\n if (this.bottomEnable) {\r\n if (this.iScroll.y < this.iScroll.maxScrollY + this.bottomPullOffset) {\r\n this._startBottomLoading();\r\n }\r\n }\r\n };\r\n\r\n Refresh.prototype._checkTopLoading = function () {\r\n if (this.topEnable) {\r\n if (this.topEl.hasClass('ipu-refresh-toload')) {\r\n this._startTopLoading();\r\n }\r\n }\r\n };\r\n\r\n // 检查内容是否超出容器高度,未超出时,自动调用底部加载\r\n Refresh.prototype._checkContentLoading = function () {\r\n if (this.bottomEnable) {\r\n if (this.iScroll.maxScrollY >= -this.bottomPullOffset) { // 此处要计算底端的高度\r\n this._startBottomLoading();\r\n }\r\n }\r\n };\r\n\r\n // 开始底部加载\r\n Refresh.prototype._startBottomLoading = function () {\r\n if (!this.bottomLoading) {\r\n this.bottomLoading = true;\r\n this.option.bottomLoadFun(); // 刷新当前索引加载更多的数据\r\n }\r\n };\r\n\r\n // 开始顶部加载\r\n Refresh.prototype._startTopLoading = function () {\r\n if (!this.topLoading) {\r\n this.topLoading = true;\r\n this.topEl.removeClass('ipu-refresh-toload').addClass('ipu-refresh-top-loading');\r\n this.iScroll.minScrollY = this.iScroll.minScrollY + this.topPullOffset;\r\n this.option.topLoadFun(); // 刷新当前索引加载更多的数据\r\n }\r\n };\r\n\r\n /**\r\n * 结束底部加载,defaultOption.bottomLoadFun中处理完加载后,最后调用此方法\r\n */\r\n Refresh.prototype.endBottomLoading = function () {\r\n this.bottomLoading = false;\r\n this.refresh();\r\n };\r\n\r\n /**\r\n * 结束顶部加载,defaultOption.topLoadFun中处理完加载后,最后调用此方法\r\n */\r\n Refresh.prototype.endTopLoading = function () {\r\n this.topEl.removeClass('ipu-refresh-top-loading');\r\n this.topLoading = false;\r\n // this.iScroll.scrollTo(0, 0); // 刷新加载则应该回到顶部,待测试确认\r\n this.refresh();\r\n };\r\n\r\n /**\r\n * 是否启动顶部加载功能\r\n *\r\n * @param {Boolean} enable\r\n */\r\n Refresh.prototype.enableTop = function (enable) {\r\n this.topEnable = enable;\r\n if (enable) {\r\n this.topEl.show();\r\n } else {\r\n this.topEl.hide();\r\n }\r\n };\r\n\r\n /**\r\n * 是否启用底部加载功能\r\n *\r\n * @param {Boolean} enable\r\n */\r\n Refresh.prototype.enableBottom = function (enable) {\r\n this.bottomEnable = enable;\r\n if (enable) {\r\n this.bottomEl.show();\r\n } else {\r\n this.bottomEl.hide();\r\n }\r\n };\r\n\r\n /**\r\n * 在内容发生变化时,但是又不是因为顶部加载或底部加载导致的,此时调用此方法刷新IScroll\r\n */\r\n Refresh.prototype.refresh = function () {\r\n this.iScroll.refresh();\r\n this._checkContentLoading();\r\n };\r\n\r\n\r\n /**\r\n * @member ipuUI\r\n * 生成PopPicker实例,参数信息见{@link Refresh#method-constructor}\r\n *\r\n * @param {String} slt\r\n * @param {Object} option\r\n * @returns {Refresh}\r\n */\r\n ipuUI.refresh = function (slt, optoins) {\r\n return new Refresh(slt, optoins);\r\n };\r\n\r\n})(ipuUI || window, jQuery, iScroll);\r\n\n// Tab\r\n(function (ipuUI, $) {\r\n\r\n /**\r\n * @class\r\n * tab切换组件功能实现\r\n *\r\n * @example\r\n * <!-- html结构 -->\r\n * <div class=\"ipu-tab\"> <!-- 如果class中添加 ipu-tab-fixed,则可固定头部,此时需要父元素的高度是确定的 -->\r\n * <ul class=\"ipu-tab-title ipu-tab-title-link\"> <!-- 页头有 ipu-tab-title-link 和 ipu-tab-title-button两种样式 -->\r\n * <li>热门推荐</li>\r\n * <li class=\"ipu-current\">全部表情</li> <!-- class为ipu-current为默认选中项 -->\r\n * <li>表情</li>\r\n * <li>表情</li>\r\n * </ul>\r\n * <div class=\"ipu-tab-body\">\r\n * <ul class=\"ipu-tab-body-wrapper\">\r\n * <li>自定义内容</li>\r\n * <li class=\"\">选项2内容</li>\r\n * <li class=\"\">选项3内容</li>\r\n * <li class=\"\">选项4内容</li>\r\n * </ul>\r\n * </div>\r\n * </div>\r\n *\r\n *\r\n * @constructor 不能直接访问该类,调用ipuUI.tab(slt, option)生成实例\r\n * @param {string|jqueryObj} slt\r\n * jquery选择器字符串或jquery对象,用来查找要被组件初始化化的dom\r\n * @param {object} option\r\n * 组件参数\r\n */\r\n function Tab(slt, option) {\r\n this.el = $(slt).get(0);\r\n this.titleItems = $(\".ipu-tab-title:first>li\", this.el);\r\n this.bodyWrapper = $(\".ipu-tab-body-wrapper:first\", this.el);\r\n this.contentItems = $(\">li\", this.bodyWrapper);\r\n\r\n this.option = $.extend({}, this.defaultOption, option);\r\n this.itemSize = this.contentItems.size();\r\n this.fixed = $(this.el).is(\".ipu-tab-fixed\"); // 是否为固定高度的\r\n\r\n var that = this;\r\n this.titleItems.each(function (index) {\r\n $(this).click(function () {\r\n that.show(index);\r\n });\r\n });\r\n\r\n var index = this.titleItems.filter(\".ipu-current\").index();\r\n if (index == -1) {\r\n index = 0;\r\n }\r\n\r\n this.show(index);\r\n }\r\n\r\n /**\r\n * 默认配置项\r\n * @cfg defaultOption = { callBack: function (index) {}};\r\n * @cfg defaultOption.callBack 切换tab项时的回调函数,参数为显示的项索引\r\n */\r\n Tab.prototype.defaultOption = {\r\n callBack: function (index) {\r\n }\r\n };\r\n\r\n /**\r\n * 显示第几项内容\r\n * @param {number} index 要显示的项索引\r\n */\r\n Tab.prototype.show = function (index) {\r\n if (this.fixed) {\r\n var move = -index * 100 + \"%\";\r\n this.bodyWrapper.css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n }\r\n this.contentItems.eq(index).addClass(\"ipu-current\").siblings().removeClass(\"ipu-current\");\r\n this.titleItems.eq(index).addClass(\"ipu-current\").siblings().removeClass(\"ipu-current\");\r\n this._end(index);\r\n };\r\n\r\n Tab.prototype._end = function (index) {\r\n this.lastIndex = this.currentIndex;\r\n this.currentIndex = index;\r\n\r\n if (this.option.callBack) {\r\n this.option.callBack(index, this.lastIndex);\r\n }\r\n };\r\n\r\n ipuUI.tab = function (slt, option) {\r\n return new Tab(slt, option);\r\n };\r\n})(ipuUI || window, jQuery);\r\n\r\n\n\r\n // 初始化代码\r\n jQuery(function () {\r\n // 添加一个touchstart空函数,让:active样式可以在ios上生效\r\n // 新版默认不需要事件好像也可生效\r\n jQuery(\"body\").on(\"touchstart\",function (e) {});\r\n\r\n // 处理ios点击延迟问题\r\n FastClick.attach(document.body);\r\n });\r\n\r\n return ipuUI;\r\n }\r\n\r\n // todo:可以添加一个和其它库的适配处理,\r\n // 这里假设第三方库,jquery,iScroll,Hammer的史称已经固定\r\n if ( typeof define === \"function\" && define.amd ) {\r\n define(['jquery', 'iScroll', 'Hammer', 'FastClick'], function (jQuery, iScroll, Hammer, FastClick) {\r\n return window.ipuUI = setup(jQuery, iScroll, Hammer, FastClick);\r\n });\r\n } else {\r\n window.ipuUI = setup(window.jQuery, window.iScroll, window.Hammer, window.FastClick);\r\n }\r\n\r\n})();\r\n\r\n//# sourceMappingURL=ipuUI.js.map\r\n"]}

+ 1 - 1
ipuui/docs/index.html

@ -61,7 +61,7 @@
61 61
</ul>
62 62
        </div>
63 63
64
  <div id='footer-content' style='display: none'>Generated on Mon 10 Sep 2018 15:12:47 by <a href='https://github.com/senchalabs/jsduck'>JSDuck</a> 5.3.4.</div>
64
  <div id='footer-content' style='display: none'>Generated on Tue 11 Sep 2018 10:50:36 by <a href='https://github.com/senchalabs/jsduck'>JSDuck</a> 5.3.4.</div>
65 65
66 66
  
67 67

+ 8 - 8
ipuui/docs/source/ipuUI.html

@ -1816,7 +1816,7 @@
1816 1816
   * @param {Function} actions.Object.onClick 点击时回调函数
1817 1817
   */
1818 1818
  modal.actions = function (params) {
1819
    var modal, groupSelector, buttonSelector;
1819
    var modalObj, groupSelector, buttonSelector;
1820 1820
    params = params || [];
1821 1821
1822 1822
    if (params.length &gt; 0 &amp;&amp; !$.isArray(params[0])) {
@ -1839,12 +1839,12 @@
1839 1839
    }
1840 1840
    modalHTML = &#39;&lt;div class=&quot;ipu-actions-modal&quot;&gt;&#39; + buttonsHTML + &#39;&lt;/div&gt;&#39;;
1841 1841
    _modalTemplateTempDiv.innerHTML = modalHTML;
1842
    modal = $(_modalTemplateTempDiv).children();
1843
    $(defaults.modalContainer).append(modal[0]);
1842
    modalObj = $(_modalTemplateTempDiv).children();
1843
    $(defaults.modalContainer).append(modalObj[0]);
1844 1844
    groupSelector = &#39;.ipu-actions-modal-group&#39;;
1845 1845
    buttonSelector = &#39;.ipu-actions-modal-button&#39;;
1846 1846
1847
    var groups = modal.find(groupSelector);
1847
    var groups = modalObj.find(groupSelector);
1848 1848
    groups.each(function (index, el) {
1849 1849
      var groupIndex = index;
1850 1850
      $(el).children().each(function (index, el) {
@ -1856,14 +1856,14 @@
1856 1856
1857 1857
        if (clickTarget) {
1858 1858
          clickTarget.on(&#39;click&#39;, function (e) {
1859
            if (buttonParams.close !== false) modal.closeModal(modal);
1860
            if (buttonParams.onClick) buttonParams.onClick(modal, e);
1859
            if (buttonParams.close !== false) modal.closeModal(modalObj);
1860
            if (buttonParams.onClick) buttonParams.onClick(modalObj, e);
1861 1861
          });
1862 1862
        }
1863 1863
      });
1864 1864
    });
1865
    modal.openModal(modal);
1866
    return modal[0];
1865
    modal.openModal(modalObj);
1866
    return modalObj[0];
1867 1867
  };
1868 1868
1869 1869
  //显示一个消息,会在2秒钟后自动消失

+ 8 - 8
ipuui/src/js/modal.js

@ -249,7 +249,7 @@
249 249
   * @param {Function} actions.Object.onClick 点击时回调函数
250 250
   */
251 251
  modal.actions = function (params) {
252
    var modal, groupSelector, buttonSelector;
252
    var modalObj, groupSelector, buttonSelector;
253 253
    params = params || [];
254 254
255 255
    if (params.length > 0 && !$.isArray(params[0])) {
@ -272,12 +272,12 @@
272 272
    }
273 273
    modalHTML = '<div class="ipu-actions-modal">' + buttonsHTML + '</div>';
274 274
    _modalTemplateTempDiv.innerHTML = modalHTML;
275
    modal = $(_modalTemplateTempDiv).children();
276
    $(defaults.modalContainer).append(modal[0]);
275
    modalObj = $(_modalTemplateTempDiv).children();
276
    $(defaults.modalContainer).append(modalObj[0]);
277 277
    groupSelector = '.ipu-actions-modal-group';
278 278
    buttonSelector = '.ipu-actions-modal-button';
279 279
280
    var groups = modal.find(groupSelector);
280
    var groups = modalObj.find(groupSelector);
281 281
    groups.each(function (index, el) {
282 282
      var groupIndex = index;
283 283
      $(el).children().each(function (index, el) {
@ -289,14 +289,14 @@
289 289
290 290
        if (clickTarget) {
291 291
          clickTarget.on('click', function (e) {
292
            if (buttonParams.close !== false) modal.closeModal(modal);
293
            if (buttonParams.onClick) buttonParams.onClick(modal, e);
292
            if (buttonParams.close !== false) modal.closeModal(modalObj);
293
            if (buttonParams.onClick) buttonParams.onClick(modalObj, e);
294 294
          });
295 295
        }
296 296
      });
297 297
    });
298
    modal.openModal(modal);
299
    return modal[0];
298
    modal.openModal(modalObj);
299
    return modalObj[0];
300 300
  };
301 301
302 302
  //显示一个消息,会在2秒钟后自动消失

liuyang50/qb-logic-flow - Nuosi Git Service

1 Commits (v1.1)

Auteur SHA1 Bericht Datum
  liuyang fbf554504e create:创建新工程,重构之前老版本逻辑编排 2 jaren geleden
Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc · 666c0f81c2 - Nuosi Git Service
Bladeren bron

Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc

wangchao 4 jaren geleden
bovenliggende
commit
666c0f81c2

Diff gegevens niet beschikbaar.