: ui.m.getSelectedItem(),\r\n d: ui.d.getSelectedItem(),\r\n h: ui.h.getSelectedItem(),\r\n i: ui.i.getSelectedItem(),\r\n toString: function () {\r\n return this.value;\r\n }\r\n };\r\n switch (type) {\r\n case 'datetime':\r\n selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value + ' ' + selected.h.value + ':' + selected.i.value;\r\n selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text + ' ' + selected.h.text + ':' + selected.i.text;\r\n break;\r\n case 'date':\r\n selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value;\r\n selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text;\r\n break;\r\n case 'time':\r\n selected.value = selected.h.value + ':' + selected.i.value;\r\n selected.text = selected.h.text + ':' + selected.i.text;\r\n break;\r\n case 'month':\r\n selected.value = selected.y.value + '-' + selected.m.value;\r\n selected.text = selected.y.text + '-' + selected.m.text;\r\n break;\r\n case 'hour':\r\n selected.value = selected.y.value + '-' + selected.m.value + '-' + selected.d.value + ' ' + selected.h.value;\r\n selected.text = selected.y.text + '-' + selected.m.text + '-' + selected.d.text + ' ' + selected.h.text;\r\n break;\r\n }\r\n return selected;\r\n };\r\n\r\n DtPicker.prototype._setSelectedValue = function (value) {\r\n var self = this;\r\n var ui = self.ui;\r\n\r\n if(!value){\r\n if(this.options.type == 'time'){\r\n value = '00:00';\r\n }else{\r\n value = defaultPickerDate.getFullYear()+'-'+(defaultPickerDate.getMonth()+1)+'-'+defaultPickerDate.getDate()+' '\r\n + defaultPickerDate.getHours() + ':' + defaultPickerDate.getMinutes();\r\n }\r\n }\r\n var parsedValue = self._parseSetValue(value);\r\n\r\n ui.y.setListen(true);\r\n ui.m.setListen(false);\r\n ui.d.setListen(false);\r\n ui.h.setListen(false);\r\n ui.i.setListen(false);\r\n ui.y.setSelectedValue(parsedValue.y);\r\n\r\n ui.m.setListen(true);\r\n ui.m.setSelectedValue(parsedValue.m);\r\n\r\n ui.d.setListen(true);\r\n ui.d.setSelectedValue(parsedValue.d);\r\n\r\n ui.h.setListen(true);\r\n ui.h.setSelectedValue(parsedValue.h);\r\n\r\n ui.i.setListen(true);\r\n ui.i.setSelectedValue(parsedValue.i);\r\n\r\n this.value = this.getSelected().value;\r\n };\r\n\r\n DtPicker.prototype.setSelectedValue = function (value) {\r\n this._setSelectedValue(value);\r\n };\r\n\r\n DtPicker.prototype.isLeapYear = function (year) {\r\n return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);\r\n };\r\n\r\n DtPicker.prototype._inArray = function (array, item) {\r\n for (var index in array) {\r\n var _item = array[index];\r\n if (_item === item) return true;\r\n }\r\n return false;\r\n };\r\n\r\n DtPicker.prototype.getDayNum = function (year, month) {\r\n var self = this;\r\n if (self._inArray([1, 3, 5, 7, 8, 10, 12], month)) {\r\n return 31;\r\n } else if (self._inArray([4, 6, 9, 11], month)) {\r\n return 30;\r\n } else if (self.isLeapYear(year)) {\r\n return 29;\r\n } else {\r\n return 28;\r\n }\r\n };\r\n\r\n DtPicker.prototype._fill = function (num) {\r\n num = num.toString();\r\n if (num.length < 2) {\r\n num = 0 + num;\r\n }\r\n return num;\r\n };\r\n\r\n DtPicker.prototype._isBeginYear = function () {\r\n return this.options.beginYear === parseInt(this.ui.y.getSelectedValue());\r\n };\r\n\r\n DtPicker.prototype._isBeginMonth = function () {\r\n return this.options.beginMonth && this._isBeginYear() && this.options.beginMonth === parseInt(this.ui.m.getSelectedValue());\r\n };\r\n\r\n DtPicker.prototype._isBeginDay = function () {\r\n return this._isBeginMonth() && this.options.beginDay === parseInt(this.ui.d.getSelectedValue());\r\n };\r\n\r\n DtPicker.prototype._isBeginHours = function () {\r\n return this._isBeginDay() && this.options.beginHours === parseInt(this.ui.h.getSelectedValue());\r\n };\r\n\r\n DtPicker.prototype._isEndYear = function () {\r\n return this.options.endYear === parseInt(this.ui.y.getSelectedValue());\r\n };\r\n\r\n DtPicker.prototype._isEndMonth = function () {\r\n return this.options.endMonth && this._isEndYear() && this.options.endMonth === parseInt(this.ui.m.getSelectedValue());\r\n };\r\n\r\n DtPicker.prototype._isEndDay = function () {\r\n return this._isEndMonth() && this.options.endDay === parseInt(this.ui.d.getSelectedValue());\r\n };\r\n\r\n DtPicker.prototype._isEndHours = function () {\r\n return this._isEndDay() && this.options.endHours === parseInt(this.ui.h.getSelectedValue());\r\n };\r\n\r\n DtPicker.prototype._createYear = function (current) {\r\n var self = this;\r\n var options = self.options;\r\n var ui = self.ui;\r\n //生成年列表\r\n var yArray = [];\r\n if (options.customData.y) {\r\n yArray = options.customData.y;\r\n } else {\r\n var yBegin = options.beginYear;\r\n var yEnd = options.endYear;\r\n for (var y = yBegin; y <= yEnd; y++) {\r\n yArray.push({\r\n text: y + '',\r\n value: y\r\n });\r\n }\r\n }\r\n ui.y.setItems(yArray);\r\n //ui.y.setSelectedValue(current);\r\n };\r\n\r\n DtPicker.prototype._createMonth = function (current) {\r\n var self = this;\r\n var options = self.options;\r\n var ui = self.ui;\r\n\r\n //生成月列表\r\n var mArray = [];\r\n if (options.customData.m) {\r\n mArray = options.customData.m;\r\n } else {\r\n var m = options.beginMonth && self._isBeginYear() ? options.beginMonth : 1;\r\n var maxMonth = options.endMonth && self._isEndYear() ? options.endMonth : 12;\r\n for (; m <= maxMonth; m++) {\r\n var val = self._fill(m);\r\n mArray.push({\r\n text: val,\r\n value: m\r\n });\r\n }\r\n }\r\n ui.m.setItems(mArray);\r\n //ui.m.setSelectedValue(current);\r\n };\r\n\r\n DtPicker.prototype._createDay = function (current) {\r\n var self = this;\r\n var options = self.options;\r\n var ui = self.ui;\r\n\r\n //生成日列表\r\n var dArray = [];\r\n if (options.customData.d) {\r\n dArray = options.customData.d;\r\n } else {\r\n var d = self._isBeginMonth() ? options.beginDay : 1;\r\n var maxDay = self._isEndMonth() ? options.endDay : self.getDayNum(parseInt(this.ui.y.getSelectedValue()), parseInt(this.ui.m.getSelectedValue()));\r\n for (; d <= maxDay; d++) {\r\n var val = self._fill(d);\r\n dArray.push({\r\n text: val,\r\n value: d\r\n });\r\n }\r\n }\r\n ui.d.setItems(dArray);\r\n //current = current || ui.d.getSelectedValue();\r\n //ui.d.setSelectedValue(current);\r\n };\r\n\r\n DtPicker.prototype._createHours = function (current) {\r\n var self = this;\r\n var options = self.options;\r\n var ui = self.ui;\r\n //生成时列表\r\n var hArray = [];\r\n if (options.customData.h) {\r\n hArray = options.customData.h;\r\n } else {\r\n var h = self._isBeginDay() ? options.beginHours : 0;\r\n var maxHours = self._isEndDay() ? options.endHours : 23;\r\n for (; h <= maxHours; h++) {\r\n var val = self._fill(h);\r\n hArray.push({\r\n text: val,\r\n value: h\r\n });\r\n }\r\n }\r\n ui.h.setItems(hArray);\r\n //ui.h.setSelectedValue(current);\r\n };\r\n\r\n DtPicker.prototype._createMinutes = function (current) {\r\n var self = this;\r\n var options = self.options;\r\n var ui = self.ui;\r\n\r\n //生成分列表\r\n var iArray = [];\r\n if (options.customData.i) {\r\n iArray = options.customData.i;\r\n } else {\r\n var i = self._isBeginHours() ? options.beginMinutes : 0;\r\n var maxMinutes = self._isEndHours() ? options.endMinutes : 59;\r\n for (; i <= maxMinutes; i++) {\r\n var val = self._fill(i);\r\n iArray.push({\r\n text: val,\r\n value: i\r\n });\r\n }\r\n }\r\n ui.i.setItems(iArray);\r\n //ui.i.setSelectedValue(current);\r\n };\r\n\r\n DtPicker.prototype._setLabels = function () {\r\n var self = this;\r\n var options = self.options;\r\n var ui = self.ui;\r\n ui.labels.each(function (i, label) {\r\n label.innerText = options.labels[i];\r\n });\r\n };\r\n\r\n DtPicker.prototype._setButtons = function () {\r\n var self = this;\r\n var options = self.options;\r\n var ui = self.ui;\r\n ui.cancel.text(options.buttons[0]);\r\n ui.ok.text(options.buttons[1]);\r\n\r\n if(options.hasClear){\r\n ui.clear.text(options.buttons[2])\r\n }else{\r\n ui.clear.hide();\r\n }\r\n\r\n ui.buttons.each(function (index) {\r\n $(this).click(function () {\r\n self.clickCall(index);\r\n })\r\n })\r\n };\r\n\r\n // 解析设置的值,目前是字符串,完整日期格式 2012-12-12 12:21\r\n DtPicker.prototype._parseSetValue = function (value) {\r\n var now = defaultPickerDate;\r\n var type = this.options.type;\r\n\r\n var rs = {\r\n y: now.getFullYear(),\r\n m: now.getMonth()+1,\r\n d: now.getDate(),\r\n h: now.getHours(),\r\n i: now.getMinutes()\r\n };\r\n\r\n if(value instanceof Date){\r\n if( type == 'time'){\r\n valu= +value.getHours()+\":\"+value.getMinutes();\r\n }else{\r\n value = value.getFullYear()+'-'+(value.getMonth()+1)+'-'+value.getDate()+ ' '\r\n +value.getHours()+\":\"+value.getMinutes();\r\n }\r\n }\r\n\r\n var parts = value.replace(\":\", \"-\").replace(\" \", \"-\").split(\"-\");\r\n for(var i=0, j=parts.length; i<j; i++){\r\n parts[i] = parseInt(parts[i]);\r\n }\r\n\r\n if(type == 'datetime'){\r\n rs.y = parts[0];\r\n rs.m = parts[1];\r\n rs.d = parts[2]; //\r\n rs.h = parts[3]; //\r\n rs.i = parts[4];\r\n }else if(type == 'date'){\r\n rs.y = parts[0];\r\n rs.m = parts[1];\r\n rs.d = parts[2]; //\r\n rs.h = 0; //\r\n rs.i = 0;\r\n }else if(type == 'time'){\r\n rs.h = parts[0]; //\r\n rs.i = parts[1];\r\n }else if(type == 'hour'){\r\n rs.y = parts[0];\r\n rs.m = parts[1];\r\n rs.d = parts[2]; //\r\n rs.h = parts[3]; //\r\n rs.i = 0;\r\n }else if(type == 'month'){\r\n rs.y = parts[0];\r\n rs.m = parts[1];\r\n rs.d = 1; //\r\n rs.h = 0; //\r\n rs.i = 0;\r\n }\r\n\r\n return rs;\r\n };\r\n\r\n DtPicker.prototype._create = function () {\r\n var self = this;\r\n var options = this.options;\r\n var now = defaultPickerDate;\r\n\r\n var beginDate = options.beginDate;\r\n if(beginDate){\r\n beginDate = this._parseSetValue(beginDate);\r\n options.beginYear = beginDate.y;\r\n options.beginMonth = beginDate.m;\r\n options.beginDay = beginDate.d;\r\n options.beginHours = beginDate.h;\r\n options.beginMinutes = beginDate.i;\r\n }else if(options.type == 'time'){\r\n options.beginYear = now.getFullYear();\r\n options.beginMonth = now.getMonth() + 1;\r\n options.beginDay = now.getDate();\r\n options.beginHours = 0;\r\n options.beginMinutes = 0;\r\n }else {\r\n options.beginYear = now.getFullYear() - 5;\r\n }\r\n\r\n var endDate = options.endDate;\r\n if (endDate) { //设定了结束日期\r\n endDate = this._parseSetValue(endDate);\r\n options.endYear = endDate.y;\r\n options.endMonth = endDate.m;\r\n options.endDay = endDate.d;\r\n options.endHours = endDate.h;\r\n options.endMinutes = endDate.i;\r\n }else if(options.type == 'time'){\r\n options.endYear = now.getFullYear();\r\n options.endMonth = now.getMonth() + 1;\r\n options.endDay = now.getDate();\r\n options.endHours = 24;\r\n options.endMinutes = 59;\r\n }else {\r\n options.endYear = options.beginYear + 10 ;\r\n }\r\n\r\n //生成\r\n self._createYear();\r\n self._createMonth();\r\n self._createDay();\r\n self._createHours();\r\n self._createMinutes();\r\n };\r\n\r\n // 更新选择框,更新当前值\r\n DtPicker.prototype.setBeginDate = function (date) {\r\n this.options.beginDate = date;\r\n this._create();\r\n };\r\n\r\n // 判断最大最小值合理性\r\n DtPicker.prototype.setEndDate = function (date) {\r\n this.options.endDate = date;\r\n this._create();\r\n };\r\n\r\n DtPicker.prototype.dispose = function () {\r\n var self = this;\r\n self.hide();\r\n setTimeout(function () {\r\n self.ui.picker.parentNode.removeChild(self.ui.picker);\r\n for (var name in self) {\r\n self[name] = null;\r\n delete self[name];\r\n }\r\n self.disposed = true;\r\n }, 300);\r\n };\r\n\r\n DtPicker.prototype.show = function (callBack) {\r\n if (callBack) {\r\n this.options.callBack = callBack;\r\n }\r\n this.mask.show();\r\n this.setSelectedValue(this.value);\r\n this.holder.addClass(\"ui-active\");\r\n };\r\n\r\n DtPicker.prototype.clickCall = function(index){\r\n var self = this;\r\n var sltDate = self.getSelected();\r\n var rs = self.options.callBack.call(this , sltDate, index);\r\n if (rs !== false) {\r\n if(index == 1){ // 假定确认按钮在第二个位置,传回true则存储当前值\r\n self.value = sltDate.value;\r\n }else if(index == 2){\r\n self.value = null;\r\n }\r\n self.hide();\r\n }\r\n };\r\n\r\n DtPicker.prototype.hide = function () {\r\n this.mask.close();\r\n this.holder.removeClass(\"ui-active\");\r\n };\r\n\r\n // 应该移除callback参数,提取出业成一个工具方法\r\n DtPicker.prototype.createMask = function(callback) {\r\n var self = this;\r\n var element = document.createElement('div');\r\n element.classList.add(\"ui-picker-backup\");\r\n //element.addEventListener($.EVENT_MOVE, $.preventDefault);\r\n element.addEventListener('click', function() {\r\n self.clickCall(0);\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 ipu.dtPicker = function(options){\r\n return new DtPicker(options);\r\n };\r\n})(ipu || window, jQuery);\r\n\n// 支持非循环\r\n// size命名用的有点混淆。。\r\n// 不能支持元素隐藏时,使用百比分处理移动距离。。。?\r\n// 支持两个以内容显示\r\n// 支持类似snap实现\r\n// 理想是移除carousel.js的实现,用hammerCarousel.js实现所有相关功能\r\n\r\n(function (ipu, $, Hammer) {\r\n function HammerCarousel(navSlt, options) {\r\n this.options = options = $.extend({}, this.defaultOptions, options);\r\n this.el = $(navSlt).get(0);\r\n this._init();\r\n }\r\n\r\n // 直接替换掉了prototype对象,可能不是个好选择\r\n HammerCarousel.prototype = {\r\n defaultOptions: {\r\n index: null, // 默认显示第几个项,其实挺没用的,默认显示第一个,用户再调用一下显示第几个,作用一样现在。\r\n autoPlay: false, // 是否自动轮播\r\n duration: 3000, // 轮播间隔\r\n indicator: false, //是否生成指示器,即小点点\r\n callBack: null, // 轮播后回调函数\r\n clickBack: null // 各子项用户点击事件\r\n //indicatorPosition: 'center', // left|right|center;暂不支持,不知道怎么支持在中间显示,用全宽度,配合point-event:none,可能ok,参考humUI和mui\r\n },\r\n _init: function () {\r\n this.wrapper = $(\">.ui-carousel-wrapper\", this.el);\r\n this.carouselItems = $(\">li\", this.wrapper);\r\n\r\n\r\n this.showSize = 1; // 假设一屏默认显示1个,所以做循环显示只需要复制一个子项\r\n this.carouselItemSizes = [];\r\n this.currentIndex = 0;\r\n this.moveLen = 0;\r\n this.lastItem = false; // index是0的时候,有可能显示的是第一项,也有可能显示的是复制项,这个参数用来判断是复制项\r\n\r\n // 这里假设每个元素都是相等的\r\n this.carouselItems.slice(0, this.showSize).clone().appendTo(this.wrapper); // 如果做无限循环则要这样处理\r\n this.size = this.carouselItems.size();\r\n\r\n var self = this;\r\n if(this.options.clickBack){\r\n $(\">li\", this.wrapper).each(function (i) {\r\n $(this).click(function () {\r\n self.options.clickBack.call(this, i%self.size);\r\n });\r\n })\r\n }\r\n\r\n this.sizeCount();\r\n var that = this;\r\n\r\n this.hammer = new Hammer.Manager(this.el); // 避免因为li里面的内容高度不够,而不能触发相关事件\r\n this.hammer.add(new Hammer.Pan({direction: Hammer.DIRECTION_HORIZONTAL, threshold: 10}));\r\n this.hammer.on(\"panstart panmove panend pancancel\", Hammer.bindFn(this.onPan, this));\r\n\r\n $(window).resize(function () { // 在尺寸变化时,处理,是否可以考虑只在宽度变化时处理,横屏事件?\r\n that.refresh();\r\n });\r\n\r\n if (this.options.index == null) {\r\n var activeIndex = this.carouselItems.filter(\".ui-active\").index();\r\n this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n }\r\n\r\n if (this.options.indicator) {\r\n this._addIndicator();\r\n }\r\n\r\n this.show(this.options.index);\r\n },\r\n stop: function () {\r\n this._pause();\r\n this.options.autoPlay = false;\r\n },\r\n _pause: function () {\r\n if (this.timeoutId) {\r\n clearTimeout(this.timeoutId);\r\n this.timeoutId = null;\r\n }\r\n },\r\n prev: function () {\r\n var index = this.currentIndex == 0 ? this.size - 1 : this.currentIndex - 1;\r\n if (index == this.size - 1) {\r\n this._show(this.size, false);\r\n this.wrapper.width();\r\n }\r\n this._show(index, true);\r\n },\r\n next: function () {//下一张\r\n var index = this.currentIndex == this.size ? 1 : this.currentIndex + 1;\r\n if (index == 1) {\r\n this._show(0, false);\r\n this.wrapper.width();\r\n }\r\n this._show(index, true);\r\n },\r\n show: function (index) {//跳到指定索引处\r\n // 用户指定跳时,在当前index==0时,涉及一个最近跳转处理,目前未处理,...不管了\r\n if (index > this.size || index < 0) {\r\n console.error(\"index超出范围!\");\r\n } else {\r\n this._show(index); // 默认追加动画\r\n }\r\n },\r\n play: function () {\r\n this.options.autoPlay = true;\r\n this._play();\r\n },\r\n _play: function () {\r\n if (this.options.autoPlay && !this.timeoutId) {\r\n var that = this;\r\n this.timeoutId = setTimeout(function () {\r\n that.timeoutId = null;//清空这个timeoutId,代表该次处理已经执行了\r\n that.next();\r\n }, that.options.duration);\r\n }\r\n },\r\n _end: function () {//移动结束时调用\r\n var currentIndex = this.currentIndex;\r\n\r\n if (this.options.callBack) {\r\n this.options.callBack(currentIndex, this.lastItem);//返回当前索引,以及是滞最后一项参数\r\n }\r\n\r\n if (this.indicator) {\r\n this.indicatorIndexs.eq(currentIndex).addClass(\"ui-active\").siblings().removeClass(\"ui-active\");\r\n }\r\n this.carouselItems.eq(currentIndex).addClass(\"ui-active\").siblings().removeClass(\"ui-active\");\r\n\r\n this._play();//处理自动播放\r\n },\r\n _addIndicator: function () {\r\n var html = \"\";\r\n for (var i = 0; i < this.size; i++) {\r\n html += \"<li></li>\";\r\n }\r\n html = \"<ul class='ui-carousel-indicator'>\" + html + \"</ul>\";\r\n this.indicator = $(html).appendTo(this.el);\r\n this.indicatorIndexs = $(\"li\", this.indicator);\r\n },\r\n sizeCount: function () {\r\n this.wrapperSize = this.wrapper.outerWidth(true);\r\n this.itemSize = this.carouselItems.eq(0).outerWidth(true);\r\n this.mostSize = this.size * this.itemSize; // 宽度*数量\r\n $(this.wrapper).removeClass(\"ui-carousel-animate\").width();\r\n\r\n var that = this;\r\n $(\">li\", this.wrapper).each(function (index, dom) { // 此处要注意,最后一个子项是后加进入的,要重新使用jquery处理一下,不能直接使用this.xx来处理\r\n that.carouselItemSizes[index] = $(this).position().left;\r\n });\r\n },\r\n refresh: function () {\r\n if (this.wrapperSize != this.wrapper.outerWidth(true)) {\r\n this.sizeCount();\r\n this._show(this.currentIndex, true); //新的位置\r\n }\r\n },\r\n move: function (moveLen) { // 类似mouseMove时的处理函数\r\n this._pause();\r\n $(this.wrapper).removeClass(\"ui-carousel-animate\");\r\n var move = (this.moveLen - moveLen) % this.mostSize;\r\n move = (move + this.mostSize) % this.mostSize;\r\n this.displayMoveLen = move;\r\n\r\n move = -move + \"px\";\r\n $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n },\r\n _show: function (index, animate) { // 知道最终移动到的项时,调用\r\n if (animate !== false) { // 默认值为true\r\n animate = true;\r\n }\r\n\r\n this._pause();\r\n $(this.wrapper).toggleClass(\"ui-carousel-animate\", animate);\r\n this.currentIndex = index % this.size;\r\n //this.currentIndex = index;\r\n this.lastItem = index == this.size;\r\n var move = this.carouselItemSizes[index];\r\n this.moveLen = move;\r\n move = -move + \"px\";\r\n\r\n $(this.wrapper).css(\"transform\", \"translate3d(\" + move + \", 0, 0)\");\r\n if (animate) {\r\n this._end();\r\n }\r\n },\r\n onPan: function (ev) {\r\n var delta = ev.deltaX;\r\n // pancancel与panend,有效的pan事件结束与无效的pan事件结束?\r\n if (ev.type == 'panend' || ev.type == 'pancancel') {\r\n var value = delta / this.itemSize;\r\n var intValue = parseInt(Math.abs(value)); // 取整数\r\n var decimal = Math.abs(value) % 1; // 取小数\r\n\r\n if (decimal > 0.2) { // 滑动超过页面宽20%;\r\n intValue = intValue + 1;\r\n }\r\n if (value > 0) {\r\n intValue = -intValue;\r\n }\r\n\r\n var index = (this.currentIndex + intValue) % this.size;\r\n index = (index + this.size) % this.size; // 因为可能是个负值,转换成正值\r\n\r\n // 当前位移大于一个项的长度,这由move方法导致的,所以此时只能是最后一项在显示,所以要显示最后一项\r\n if (index == 0 && this.displayMoveLen > this.itemSize) {\r\n index = this.size;\r\n }\r\n this._show(index);\r\n } else if (ev.type == 'panmove'){\r\n this.move(delta);\r\n }\r\n }\r\n };\r\n\r\n ipu.hammerCarousel = function (slt, options) {\r\n return new HammerCarousel(slt, options);\r\n };\r\n})(ipu || window, jQuery, Hammer);\r\n\n(function (ipu, $) {\r\n //$ extends\r\n function __dealCssEvent(eventNameArr, callback) {\r\n // console.log('__dealCssEvent');\r\n var events = eventNameArr,\r\n i, dom = this;// jshint ignore:line\r\n\r\n function fireCallBack(e) {\r\n /*jshint validthis:true */\r\n if (e.target !== this) return;\r\n callback.call(this, e);\r\n for (i = 0; i < events.length; i++) {\r\n dom.off(events[i], fireCallBack);\r\n }\r\n }\r\n\r\n if (callback) {\r\n for (i = 0; i < events.length; i++) {\r\n dom.on(events[i], fireCallBack);\r\n }\r\n }\r\n }\r\n\r\n $.fn.transitionEnd = function (callback) {\r\n // console.log('transitionEnd');\r\n __dealCssEvent.call(this, ['webkitTransitionEnd', 'transitionend'], callback);\r\n return this;\r\n };\r\n\r\n\r\n\r\n var _modalTemplateTempDiv = document.createElement('div');\r\n\r\n var defaults = {\r\n modalStack: true,\r\n modalButtonOk: '确定',\r\n modalButtonCancel: '取消',\r\n modalPreloaderTitle: '加载中',\r\n modalContainer: document.body ? document.body : 'body'\r\n };\r\n\r\n ipu.modalStack = [];\r\n\r\n ipu.modalStackClearQueue = function () {\r\n if (ipu.modalStack.length) {\r\n (ipu.modalStack.shift())();\r\n }\r\n };\r\n ipu.modal = function (params) {\r\n params = params || {};\r\n var modalHTML = '';\r\n var buttonsHTML = '';\r\n if (params.buttons && params.buttons.length > 0) {\r\n for (var i = 0; i < params.buttons.length; i++) {\r\n buttonsHTML += '<span class=\"ui-modal-button' + (params.buttons[i].bold ? ' ui-modal-button-bold' : '') + '\">' + params.buttons[i].text + '</span>';\r\n }\r\n }\r\n var extraClass = params.extraClass || '';\r\n var titleHTML = params.title ? '<div class=\"ui-modal-title\">' + params.title + '</div>' : '';\r\n var textHTML = params.text ? '<div class=\"ui-modal-text\">' + params.text + '</div>' : '';\r\n var afterTextHTML = params.afterText ? params.afterText : '';\r\n var noButtons = !params.buttons || params.buttons.length === 0 ? 'ui-modal-no-buttons' : '';\r\n var verticalButtons = params.verticalButtons ? 'ui-modal-buttons-vertical' : '';\r\n modalHTML = '<div class=\"ui-modal ' + extraClass + ' ' + noButtons + '\"><div class=\"ui-modal-inner\">' + (titleHTML + textHTML + afterTextHTML) + '</div><div class=\"ui-modal-buttons ' + verticalButtons + '\">' + buttonsHTML + '</div></div>';\r\n\r\n _modalTemplateTempDiv.innerHTML = modalHTML;\r\n\r\n var modal = $(_modalTemplateTempDiv).children();\r\n\r\n $(defaults.modalContainer).append(modal[0]);\r\n\r\n // Add events on buttons\r\n modal.find('.ui-modal-button').each(function (index, el) {\r\n $(el).on('click', function (e) {\r\n if (params.buttons[index].close !== false) ipu.closeModal(modal);\r\n if (params.buttons[index].onClick) params.buttons[index].onClick(modal, e);\r\n if (params.onClick) params.onClick(modal, index);\r\n });\r\n });\r\n ipu.openModal(modal);\r\n return modal[0];\r\n };\r\n ipu.alert = function (text, title, callbackOk) {\r\n if (typeof title === 'function') {\r\n callbackOk = arguments[1];\r\n title = undefined;\r\n }\r\n return ipu.modal({\r\n text: text || '',\r\n title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n buttons: [{text: defaults.modalButtonOk, bold: true, onClick: callbackOk}]\r\n });\r\n };\r\n ipu.confirm = function (text, title, callbackOk, callbackCancel) {\r\n if (typeof title === 'function') {\r\n callbackCancel = arguments[2];\r\n callbackOk = arguments[1];\r\n title = undefined;\r\n }\r\n return ipu.modal({\r\n text: text || '',\r\n title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n buttons: [\r\n {text: defaults.modalButtonCancel, omodalButtonCancelnClick: callbackCancel},\r\n {text: defaults.modalButtonOk, bold: true, onClick: callbackOk}\r\n ]\r\n });\r\n };\r\n ipu.prompt = function (text, title, callbackOk, callbackCancel) {\r\n if (typeof title === 'function') {\r\n callbackCancel = arguments[2];\r\n callbackOk = arguments[1];\r\n title = undefined;\r\n }\r\n return ipu.modal({\r\n text: text || '',\r\n title: typeof title === 'undefined' ? defaults.modalTitle : title,\r\n afterText: '<input type=\"text\" class=\"ui-modal-text-input\">',\r\n buttons: [\r\n {\r\n text: defaults.modalButtonCancel\r\n },\r\n {\r\n text: defaults.modalButtonOk,\r\n bold: true\r\n }\r\n ],\r\n onClick: function (modal, index) {\r\n if (index === 0 && callbackCancel) callbackCancel($(modal).find('.ui-modal-text-input').val());\r\n if (index === 1 && callbackOk) callbackOk($(modal).find('.ui-modal-text-input').val());\r\n }\r\n });\r\n };\r\n\r\n var minLoad = false; // 是否最小时间调用方式\r\n var loadOverTime = false; // 是否超过最小调用时间\r\n var loadEnd = false; // 是否调用结束\r\n var loadTimeOut = null; // 延时调用ID\r\n\r\n ipu.showPreloader = function (title, minTime) {\r\n ipu.hidePreloader(true);\r\n\r\n ipu.showPreloader.preloaderModal = ipu.modal({\r\n title: title || defaults.modalPreloaderTitle,\r\n text: '<div class=\"ui-preloader\"></div>'\r\n });\r\n\r\n if(minTime){\r\n minLoad = true;\r\n loadTimeOut = setTimeout(function () {\r\n loadOverTime = true;\r\n if(loadEnd){\r\n ipu.hidePreloader();\r\n }\r\n }, minTime);\r\n }\r\n\r\n return ipu.showPreloader.preloaderModal;\r\n };\r\n ipu.hidePreloader = function (force) {\r\n if(force || !minLoad || (minLoad && loadOverTime)){\r\n if(force && loadTimeOut){\r\n window.clearTimeout(loadTimeOut);\r\n }\r\n ipu.showPreloader.preloaderModal && ipu.closeModal(ipu.showPreloader.preloaderModal);\r\n minLoad = false; // 重置各标志位\r\n loadOverTime = false;\r\n loadEnd = false;\r\n loadTimeOut = null;\r\n }else{\r\n loadEnd = true;\r\n }\r\n };\r\n ipu.showIndicator = function () {\r\n if ($('.ui-preloader-indicator-modal')[0]) return;\r\n $(defaults.modalContainer).append('<div class=\"ui-preloader-indicator-overlay\"></div><div class=\"ui-preloader-indicator-modal\"><span class=\"ui-preloader ui-preloader-white\"></span></div>');\r\n };\r\n ipu.hideIndicator = function () {\r\n $('.ui-preloader-indicator-overlay, .ui-preloader-indicator-modal').remove();\r\n };\r\n // Action Sheet\r\n ipu.actions = function (params) {\r\n var modal, groupSelector, buttonSelector;\r\n params = params || [];\r\n\r\n if (params.length > 0 && !$.isArray(params[0])) {\r\n params = [params];\r\n }\r\n var modalHTML;\r\n var buttonsHTML = '';\r\n for (var i = 0; i < params.length; i++) {\r\n for (var j = 0; j < params[i].length; j++) {\r\n if (j === 0) buttonsHTML += '<div class=\"ui-actions-modal-group\">';\r\n var button = params[i][j];\r\n var buttonClass = button.label ? 'ui-actions-modal-label' : 'ui-actions-modal-button';\r\n if (button.bold) buttonClass += ' ui-actions-modal-button-bold';\r\n if (button.color) buttonClass += ' ui-color-' + button.color;\r\n if (button.bg) buttonClass += ' ui-bg-' + button.bg;\r\n if (button.disabled) buttonClass += ' disabled';\r\n buttonsHTML += '<span class=\"' + buttonClass + '\">' + button.text + '</span>';\r\n if (j === params[i].length - 1) buttonsHTML += '</div>';\r\n }\r\n }\r\n modalHTML = '<div class=\"ui-actions-modal\">' + buttonsHTML + '</div>';\r\n _modalTemplateTempDiv.innerHTML = modalHTML;\r\n modal = $(_modalTemplateTempDiv).children();\r\n $(defaults.modalContainer).append(modal[0]);\r\n groupSelector = '.ui-actions-modal-group';\r\n buttonSelector = '.ui-actions-modal-button';\r\n\r\n var groups = modal.find(groupSelector);\r\n groups.each(function (index, el) {\r\n var groupIndex = index;\r\n $(el).children().each(function (index, el) {\r\n var buttonIndex = index;\r\n var buttonParams = params[groupIndex][buttonIndex];\r\n var clickTarget;\r\n if ($(el).is(buttonSelector)) clickTarget = $(el);\r\n // if (toPopover && $(el).find(buttonSelector).length > 0) clickTarget = $(el).find(buttonSelector);\r\n\r\n if (clickTarget) {\r\n clickTarget.on('click', function (e) {\r\n if (buttonParams.close !== false) ipu.closeModal(modal);\r\n if (buttonParams.onClick) buttonParams.onClick(modal, e);\r\n });\r\n }\r\n });\r\n });\r\n ipu.openModal(modal);\r\n return modal[0];\r\n };\r\n\r\n //显示一个消息,会在2秒钟后自动消失\r\n ipu.toast = function (msg, duration, extraclass) {\r\n var $toast = $('<div class=\"ui-modal ui-toast ' + (extraclass || '') + '\">' + msg + '</div>').appendTo(document.body);\r\n ipu.openModal($toast, function () {\r\n setTimeout(function () {\r\n ipu.closeModal($toast);\r\n }, duration || 2000);\r\n });\r\n };\r\n ipu.openModal = function (modal, cb) {\r\n modal = $(modal);\r\n var isModal = modal.hasClass('ui-modal'),\r\n isNotToast = !modal.hasClass('ui-toast');\r\n isNotToast = false; // 强制打开新窗口\r\n if ($('.ui-modal.ui-modal-in:not(.ui-modal-out)').length && defaults.modalStack && isModal && isNotToast) {\r\n ipu.modalStack.push(function () {\r\n ipu.openModal(modal, cb);\r\n });\r\n return;\r\n }\r\n var isPopup = modal.hasClass('ui-popup');\r\n var isLoginScreen = modal.hasClass('ui-login-screen');\r\n var isPickerModal = modal.hasClass('ui-picker-modal');\r\n var isToast = modal.hasClass('ui-toast');\r\n if (isModal) {\r\n modal.show();\r\n modal.css({\r\n marginTop: -Math.round(modal.outerHeight() / 2) + 'px'\r\n });\r\n }\r\n if (isToast) {\r\n modal.css({\r\n marginLeft: -Math.round(modal.outerWidth() / 2 / 1.185) + 'px' //1.185 是初始化时候的放大效果\r\n });\r\n }\r\n\r\n var overlay;\r\n if (!isLoginScreen && !isPickerModal && !isToast) {\r\n if ($('.ui-modal-overlay').length === 0 && !isPopup) {\r\n $(defaults.modalContainer).append('<div class=\"ui-modal-overlay\"></div>');\r\n }\r\n if ($('.ui-popup-overlay').length === 0 && isPopup) {\r\n $(defaults.modalContainer).append('<div class=\"ui-popup-overlay\"></div>');\r\n }\r\n overlay = isPopup ? $('.ui-popup-overlay') : $('.ui-modal-overlay');\r\n }\r\n\r\n //Make sure that styles are applied, trigger relayout;\r\n var clientLeft = modal[0].clientLeft;\r\n\r\n // Trugger open event\r\n modal.trigger('open');\r\n\r\n // Picker modal body class\r\n if (isPickerModal) {\r\n $(defaults.modalContainer).addClass('ui-with-picker-modal');\r\n }\r\n\r\n // Classes for transition in\r\n if (!isLoginScreen && !isPickerModal && !isToast) overlay.addClass('ui-modal-overlay-visible');\r\n modal.removeClass('ui-modal-out').addClass('ui-modal-in').transitionEnd(function (e) {\r\n if (modal.hasClass('ui-modal-out')) modal.trigger('closed');\r\n else modal.trigger('opened');\r\n });\r\n // excute callback\r\n if (typeof cb === 'function') {\r\n cb.call(this);\r\n }\r\n return true;\r\n };\r\n ipu.closeModal = function (modal) {\r\n modal = $(modal || '.ui-modal-in');\r\n if (typeof modal !== 'undefined' && modal.length === 0) {\r\n return;\r\n }\r\n var isModal = modal.hasClass('ui-modal'),\r\n isPopup = modal.hasClass('ui-popup'),\r\n isToast = modal.hasClass('ui-toast'),\r\n isLoginScreen = modal.hasClass('ui-login-screen'),\r\n isPickerModal = modal.hasClass('ui-picker-modal'),\r\n removeOnClose = modal.hasClass('ui-remove-on-close'),\r\n overlay = isPopup ? $('.ui-popup-overlay') : $('.ui-modal-overlay');\r\n if (isPopup) {\r\n if (modal.length === $('.ui-popup.ui-modal-in').length) {\r\n overlay.removeClass('ui-modal-overlay-visible');\r\n }\r\n }\r\n else if (!(isPickerModal || isToast)) {\r\n overlay.removeClass('ui-modal-overlay-visible');\r\n }\r\n modal.trigger('close');\r\n\r\n // Picker modal body class\r\n if (isPickerModal) {\r\n $(defaults.modalContainer).removeClass('ui-with-picker-modal');\r\n $(defaults.modalContainer).addClass('ui-picker-modal-closing');\r\n }\r\n\r\n modal.removeClass('ui-modal-in').addClass('ui-modal-out').transitionEnd(function (e) {\r\n if (modal.hasClass('ui-modal-out')) modal.trigger('closed');\r\n else modal.trigger('opened');\r\n\r\n if (isPickerModal) {\r\n $(defaults.modalContainer).removeClass('ui-picker-modal-closing');\r\n }\r\n if (isPopup || isLoginScreen || isPickerModal) {\r\n modal.removeClass('ui-modal-out').hide();\r\n if (removeOnClose && modal.length > 0) {\r\n modal.remove();\r\n }\r\n }\r\n else {\r\n modal.remove();\r\n }\r\n });\r\n if (isModal && defaults.modalStack) {\r\n ipu.modalStackClearQueue();\r\n }\r\n\r\n return true;\r\n };\r\n function handleClicks(e) {\r\n /*jshint validthis:true */\r\n var clicked = $(this);\r\n var url = clicked.attr('href');\r\n\r\n\r\n //Collect Clicked data- attributes\r\n /* var clickedData = clicked.dataset();\r\n\r\n // Popup\r\n var popup;\r\n if (clicked.hasClass('ui-open-popup')) {\r\n if (clickedData.popup) {\r\n popup = clickedData.popup;\r\n }\r\n else popup = '.ui-popup';\r\n ipu.popup(popup);\r\n }\r\n if (clicked.hasClass('ui-close-popup')) {\r\n if (clickedData.popup) {\r\n popup = clickedData.popup;\r\n }\r\n else popup = '.ui-popup.modal-in';\r\n ipu.closeModal(popup);\r\n }*/\r\n\r\n // Close Modal\r\n if (clicked.hasClass('ui-modal-overlay')) {\r\n if ($('.ui-modal.ui-modal-in').length > 0 && defaults.modalCloseByOutside)\r\n ipu.closeModal('.ui-modal.ui-modal-in');\r\n if ($('.ui-actions-modal.ui-modal-in').length > 0 && defaults.actionsCloseByOutside)\r\n ipu.closeModal('.ui-actions-modal.ui-modal-in');\r\n\r\n }\r\n if (clicked.hasClass('ui-popup-overlay')) {\r\n if ($('.ui-popup.ui-modal-in').length > 0 && defaults.popupCloseByOutside)\r\n ipu.closeModal('.ui-popup.modal-in');\r\n }\r\n }\r\n\r\n $(document).on('click', ' .ui-modal-overlay, .ui-popup-overlay, .ui-close-popup, .ui-open-popup, .ui-close-picker', handleClicks);\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $) {\r\n NavBar.prototype.defaultOpt = {\r\n animate: false, // 默认有动画\r\n contentSlt: \".ui-nav-content\",\r\n callBack: function (currentIndex, lastIndex) { // currentIndex: 当前索引,lastIndex上一次索引(第一次时为null)\r\n }\r\n };\r\n\r\n function NavBar(slt, options) {\r\n this.options = $.extend({}, this.defaultOpt, options);\r\n this.content = $(this.options.contentSlt);\r\n this.nav = $(slt);\r\n this.wrapper = $(\">ul\", this.content);\r\n this.contents = $(\">li\", this.wrapper);\r\n this.navs = $(\">a\", this.nav);\r\n var me = this;\r\n\r\n var activeIndex = this.navs.filter(\".ui-active\").index(); // 查找默认有active的索引\r\n if (activeIndex == -1) {\r\n activeIndex = this.contents.filter(\".ui-active\").index(); // 查找默认有active的索引\r\n }\r\n this.options.index = activeIndex != -1 ? activeIndex : 0;\r\n\r\n if (!this.options.animate) {\r\n this.wrapper.addClass(\"ui-no-animation\")\r\n }\r\n\r\n this.navs.each(function (index, i) {\r\n $(this).click(function () {\r\n me.show(index);\r\n });\r\n });\r\n\r\n this.lastIndex = null;\r\n this.currentIndex = null;\r\n me.show(this.options.index);\r\n }\r\n\r\n NavBar.prototype.show = function (index) {\r\n if (this.currentIndex != index) {\r\n var currentContent = $(this.contents[index]).addClass(\"ui-show\");\r\n\r\n if (this.options.animate) {\r\n if (this.lastIndex != null && this.lastIndex != index) {\r\n $(this.contents[this.lastIndex]).removeClass(\"ui-show\"); // 隐藏上上个元素\r\n }\r\n\r\n if (this.currentIndex != null) { // 非第一次需要动画效果\r\n if (this.currentIndex < index) { // 需要内容为往左走,显示右边的内容\r\n if (this.lastIndex != null && this.lastIndex < this.currentIndex) { // 内容已经左走过了,则需要移除动画复原位置,再通过width()方法强制生效\r\n this.wrapper.addClass(\"ui-no-animation\").removeClass(\"ui-nav-content-right\").width(); // 可以强制刷新,默认jquery应该会将这些dom上的修改延时处理?\r\n }\r\n } else {\r\n if (this.lastIndex == null || this.lastIndex > this.currentIndex) { // 类似同上\r\n this.wrapper.addClass(\"ui-no-animation\").addClass(\"ui-nav-content-right\").width(); // 可以强制刷新不?\r\n }\r\n }\r\n this.wrapper.removeClass(\"ui-no-animation\").toggleClass(\"ui-nav-content-right\");\r\n }\r\n } else {\r\n $(this.contents[this.currentIndex]).removeClass(\"ui-show\");\r\n }\r\n\r\n // 更新class,ui-active状态\r\n $(this.contents[index]).addClass(\"ui-active\").siblings(\".ui-active\").removeClass(\"ui-active\");\r\n $(this.navs[index]).addClass(\"ui-active\").siblings(\".ui-active\").removeClass(\"ui-active\");\r\n\r\n this.lastIndex = this.currentIndex;\r\n this.currentIndex = index;\r\n\r\n if (this.options.callBack) {\r\n this.options.callBack(this.currentIndex, this.lastIndex);\r\n }\r\n }\r\n };\r\n\r\n ipu.navBar = function (slt, options) {\r\n return new NavBar(slt, options);\r\n };\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $) {\r\n function __dealCssEvent(eventNameArr, callback) {\r\n var events = eventNameArr,\r\n i, dom = this;// jshint ignore:line\r\n\r\n function fireCallBack(e) {\r\n if (e.target !== this) return;\r\n callback.call(this, e);\r\n for (i = 0; i < events.length; i++) {\r\n dom.off(events[i], fireCallBack);\r\n }\r\n }\r\n\r\n if (callback) {\r\n for (i = 0; i < events.length; i++) {\r\n dom.on(events[i], fireCallBack);\r\n }\r\n }\r\n }\r\n\r\n $.fn.animationEnd = function (callback) {\r\n __dealCssEvent.call(this, ['webkitAnimationEnd', 'animationend'], callback);\r\n return this;\r\n };\r\n\r\n function submitForm(doc, url ,params){\r\n var form = doc.createElement(\"form\");\r\n form.action = url;\r\n form.method = \"post\";\r\n form.style.display = \"none\";\r\n\r\n for (var x in params) {\r\n var ele = doc.createElement(\"input\");\r\n ele.type=\"hidden\";\r\n ele.name = x;\r\n ele.value = params[x];\r\n form.appendChild(ele);\r\n }\r\n\r\n doc.body.appendChild(form);\r\n form.submit();\r\n }\r\n\r\n // 检查是否有ui-pages的结构\r\n function checkPages() {\r\n if(!hasPages){\r\n pagesObj = $(\".ui-pages\"); // pagesObj为空则进行jquery取值\r\n if(pagesObj.size() == 0){\r\n pagesObj = $(\"<div class='ui-pages'><div class='ui-page ui-show \"+zeroPageClass+\"' id='\"+pageIdPrefix+\"0'></div>\").appendTo(\"body\");\r\n }\r\n hasPages = true;\r\n }\r\n }\r\n\r\n // 站位页面\r\n function isZeroPage(page) {\r\n return $(page).hasClass(zeroPageClass);\r\n }\r\n\r\n var page = {};\r\n var hasPages = false;\r\n var maps = {};\r\n var pageNo = 1; // 编号0留给主页面或当前页面,或没有\r\n var pageIdPrefix = \"ipuPage-\";\r\n var pagesObj = null;\r\n var animateInClass = \"ui-anim ui-slideRightIn\";\r\n var animateOutClass = \"ui-anim ui-slideRightOut\";\r\n var eventName = \"ipuUIPageBack\";\r\n var zeroPageClass = 'ui-page-zero';\r\n var zeroPagesClass = 'ui-pages-zero';\r\n\r\n page.options = { // 那个窗口执行open,默认父窗口\r\n target: window.parent, // 默认执行父窗口\r\n backIndex: -1, // 默认回退一页\r\n closeIndex: -1, // 默认关闭最近一个页面\r\n params:{}, // post的默认参数\r\n animate: true, // 是否动画效果\r\n showLoading: true, // 是否显示加载消息\r\n loadingMessage: '正在加载中',\r\n method : null, // 请求方式,用户不需要设置\r\n minMessageTime: 500, // 最小显示加载时间,避免出现闪现的情况\r\n callBack:function () { // 事件回调\r\n }\r\n };\r\n\r\n // 当前页面加载,针对顶层父窗口\r\n page.openPage = function (url, options) {\r\n var newPage = null;\r\n var nowPageNo = pageIdPrefix + (pageNo++);\r\n maps[nowPageNo] = url;\r\n\r\n checkPages();\r\n\r\n if(options.showLoading){\r\n ipu.showPreloader(options.loadingMessage, options.minMessageTime);\r\n }\r\n\r\n if(options.method == 'post'){\r\n newPage = $(\"<div class='ui-page' id='\"+nowPageNo+\"'><iframe class='ui-page-iframe'></iframe></div>\");\r\n }else{\r\n newPage = $(\"<div class='ui-page' id='\"+nowPageNo+\"'><iframe class='ui-page-iframe' src='\"+url+\"'></iframe></div>\");\r\n }\r\n\r\n var zeroPage = isZeroPage($(\".ui-page:last\", pagesObj));\r\n var animatePage = newPage;\r\n if(zeroPage){\r\n animatePage = pagesObj.addClass(zeroPagesClass);\r\n }\r\n\r\n function end() {\r\n if(options.showLoading) {\r\n ipu.hidePreloader();\r\n }\r\n\r\n if(options.animate) {\r\n animatePage.removeClass(animateInClass);\r\n }\r\n\r\n newPage.siblings(\".ui-show\").removeClass('ui-show');\r\n if(options.callBack){\r\n options.callBack();\r\n }\r\n }\r\n\r\n $(\".ui-page-iframe\", newPage).one('load', function () {\r\n newPage.addClass(\"ui-show\").width(); // 强制生效,否则可能出现页面闪现,无动画情况\r\n\r\n if(zeroPage){\r\n animatePage.removeClass(zeroPagesClass);\r\n }\r\n if(options.animate){\r\n animatePage.addClass(animateInClass).animationEnd(end);\r\n }else{\r\n end();\r\n }\r\n });\r\n\r\n newPage.appendTo(pagesObj);\r\n if(options.method == 'post') {\r\n var pageDoc = $(\".ui-page-iframe\", newPage)[0].contentDocument;\r\n submitForm(pageDoc, url, options.params);\r\n }\r\n };\r\n\r\n // post方式加载页面\r\n page.postPage = function (url, options) {\r\n options.method = 'post';\r\n page.openPage(url, options);\r\n };\r\n\r\n // 当前页面后退,针对顶层父窗口\r\n page.backPage = function (options) {\r\n var backIndex = options.backIndex;\r\n var page = null;\r\n var nowPage = $(\".ui-page.ui-show\", pagesObj);\r\n\r\n if(backIndex == 0){\r\n page = $(\".ui-page:first\", pagesObj);\r\n }else { // 越界的情况\r\n var prevPage = nowPage.prevAll(\".ui-page\");\r\n if(backIndex < 0){\r\n page= $(prevPage[-backIndex - 1]);\r\n }else{\r\n page= $(prevPage[prevPage.size() - backIndex]);\r\n }\r\n }\r\n\r\n var animatePage = nowPage;\r\n var zeroPage = isZeroPage(page);\r\n\r\n // 主页面模式时\r\n if(zeroPage){\r\n animatePage = pagesObj;\r\n }else{\r\n page.addClass(\"ui-show\"); //显示前一个\r\n }\r\n\r\n function end (){\r\n $(this).removeClass(animateOutClass);\r\n page.nextAll(\".ui-page\").remove();\r\n\r\n var iframe = $(\".ui-page-iframe\", page);\r\n var nowDoc;\r\n\r\n if(iframe.size() == 0){ // 找不到子窗口就当是返回了主页面,在当前窗口触发\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(options.data){\r\n evt.data = options.data;\r\n }\r\n nowDoc.body.dispatchEvent(evt);\r\n if(options.callBack){\r\n options.callBack();\r\n }\r\n }\r\n\r\n if(options.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 (options) {\r\n var closeIndex = options.closeIndex;\r\n var prevPage = $(\".ui-page.ui-show\", pagesObj).prevAll(\".ui-page\");\r\n\r\n 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(options.callBack){\r\n options.callBack();\r\n }\r\n };\r\n\r\n // 调用父窗口打开页面\r\n page.open = function (url, options) {\r\n options = $.extend({}, this.options, options);\r\n options.target.ipu.page.openPage(url, options);\r\n };\r\n\r\n // post方法\r\n page.post = function (url, options) {\r\n options = $.extend({}, this.options, options);\r\n options.method = 'post';\r\n options.target.ipu.page.openPage(url, options);\r\n };\r\n\r\n // 调用父窗口,回退\r\n page.back = function (options) {\r\n options = $.extend({}, this.options, options);\r\n options.target.ipu.page.backPage(options);\r\n };\r\n\r\n // 返回首页\r\n page.backHome = function (options) {\r\n options = options || {};\r\n options.backIndex = 0;\r\n page.back(options);\r\n };\r\n\r\n // 子窗口,待确认\r\n page.close = function (options) {\r\n options = $.extend({}, this.options, options);\r\n options.target.ipu.page.closePage(options);\r\n };\r\n\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 ipu.page = page;\r\n})(ipu || window, jQuery);\r\n\n// picker\r\n(function (ipu, $, Hammer) {\r\n var showItemSize = 9; // 显示的子项数量,\r\n var r = 90; // 计算旋转的圆半径,结果应该缩小,是为了r不要距离容器太近\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 function Picker(slt, options) {\r\n this.el = $(slt)[0];\r\n this.options = $.extend({}, this.defaultOptions, options);\r\n this._init();\r\n }\r\n\r\n // 默认参数\r\n Picker.prototype.defaultOptions = {\r\n onChange: function () { // 子项选中事件\r\n },\r\n listen: true, // 默认已开记监听变化\r\n data: []\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.options.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 this.empty = this.options.data.length == 0;\r\n\r\n // 如果是ios,则ul的旋转中心点,有变化\r\n if(ipu.device.ios){\r\n this.wrap.css(\"transform-origin\", \"center center \"+r+\"px\"); //如果是ios,要变更旋转的中心点\r\n }\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 this.hammer.on(\"press pressup\", function (e) { // 如果用户点击了,是停止自动滚动\r\n // console.log('press');\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 this.setItems(this.options.data);\r\n };\r\n\r\n Picker.prototype.setItems = function (data, textName) {\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; // 表示设置了新数据,触发change回调,但第一次设置时,不需要触发\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(\" + r + \"px) rotateX(-\" + (i * itemAngle) + \"deg)\",\r\n \"transform-origin\": \"center center -\" + r + \"px\"\r\n });\r\n $(this).click(function () {\r\n console.log('click');\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 /*if (this.index !== null) { // 当前已经旋转则,保留当前的索引\r\n if (this.index > this.itemsSize - 1 && !this.empty) {\r\n this.index = this.itemsSize - 1;\r\n }\r\n this.setAngle(this.index * itemAngle, true);\r\n } else { // 第一次初始数据,不触发change事件\r\n this.index = 0; // 被调用后,不能再使用null值了\r\n this.setAngle(0, false); // 第一次设置初始化时,不触发change事件\r\n }*/\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(\"ui-noanimate\"); // 移除动画\r\n this.stopInertiaMove = true; // 停止自动减速滚动\r\n // console.log('panstart');\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 // endScroll 是否为结束的滚动结束,滚动结束需要调用结束事件\r\n Picker.prototype.setAngle = function (newAngle, endScroll) {\r\n this.angle = newAngle; // 存储最新值\r\n this.wrap.css(\"transform\", \"perspective(1000px) 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 this.newData = false;\r\n // console.log('change');\r\n if (this.options.onChange && this.listen) {\r\n // console.log('changed call');\r\n this.options.onChange(this.getSelectedItem(), this.index, oldIndex, this.newData);\r\n }\r\n }\r\n }\r\n };\r\n\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(\"ui-highlight ui-visible\");\r\n } else if (difference >= (90 - itemAngle / 2)) { // 距离不能超过90度\r\n $(this).removeClass(\"ui-highlight ui-visible\");\r\n } else {\r\n $(this).addClass(\"ui-visible\").removeClass(\"ui-highlight\");\r\n }\r\n });\r\n };\r\n\r\n // 设置最后回归位置\r\n Picker.prototype.endScroll = function () {\r\n this.wrap.removeClass(\"ui-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 Picker.prototype.setListen = function (bool) {\r\n this.listen = !!bool;\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 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 Picker.prototype.getSelectedItem = function () {\r\n return this.empty ? {}: this.data[this.index];\r\n };\r\n\r\n Picker.prototype.getSelectedValue = function () {\r\n return this.getSelectedItem().value;\r\n };\r\n\r\n Picker.prototype.getSelectedText = function () {\r\n return this.getSelectedItem().text;\r\n };\r\n\r\n Picker.prototype.getSelectedIndex = function () {\r\n return this.index;\r\n };\r\n\r\n ipu.Picker = Picker;\r\n\r\n})(ipu || window, jQuery, Hammer);\r\n\n// popPicker\r\n(function (ipu, $) {\r\n var Picker = ipu.Picker;\r\n\r\n function PopPicker(options) {\r\n this.options = $.extend({}, this.defaultOptions, options);\r\n if(!Picker){\r\n Picker = ipu.Picker;\r\n }\r\n this._init();\r\n }\r\n\r\n PopPicker.prototype.defaultOptions = {\r\n template: '<div class=\"ui-poppicker\">\\\r\n <div class=\"ui-poppicker-header\">\\\r\n <button class=\"ui-btn ui-btn-s ui-poppicker-btn-cancel\">取消</button>\\\r\n <button class=\"ui-btn ui-btn-s ui-poppicker-btn-ok\">确定</button>\\\r\n </div>\\\r\n <div class=\"ui-poppicker-body\">\\\r\n </div>\\\r\n </div>',\r\n pickerTemplate: '<div class=\"ui-picker\">\\\r\n <div class=\"ui-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 PopPicker.prototype._init = function () {\r\n this.holder = $(this.options.template).appendTo(\"body\");\r\n var bodyHtml = $(\".ui-poppicker-body\", this.holder);\r\n\r\n var layer = this.options.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.options.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, index) { // 更新底部的值\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 $(\".ui-poppicker-btn-ok\", this.holder).click(function () {\r\n var rs = self.getSelectItems();\r\n if (self.options.callBack(rs) !== false) {\r\n self.hide();\r\n }\r\n }).text(this.options.btns[1]);\r\n\r\n $(\".ui-poppicker-btn-cancel\", this.holder).click(function () {\r\n self.hide();\r\n }).text(this.options.btns[0]);\r\n };\r\n\r\n PopPicker.prototype.setData = function (data) {\r\n this.pickers[0].setItems(data);\r\n };\r\n\r\n PopPicker.prototype.show = function (callBack) {\r\n if (callBack) {\r\n this.options.callBack = callBack;\r\n }\r\n this.mask.show();\r\n this.holder.addClass(\"ui-active\");\r\n };\r\n\r\n PopPicker.prototype.hide = function () {\r\n this.mask.close();\r\n this.holder.removeClass(\"ui-active\");\r\n };\r\n\r\n // 获取相关值\r\n PopPicker.prototype.getSelectItems = function () {\r\n if (this.options.layer == 1) {\r\n return this.pickers[0].getSelectedItem();\r\n } else {\r\n var rs = [];\r\n for (var i = 0; i < this.options.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(\"ui-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 ipu.popPicker = function (options) {\r\n return new PopPicker(options);\r\n };\r\n\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $) {\r\n\r\n /**\r\n *进度条\r\n */\r\n function progressBar(id, options) {\r\n this.id = id;\r\n this.level = options.level;\r\n this.progress = options.progress;\r\n this.progressBar = $(id).eq(0);\r\n\r\n if (options.progress != null) {\r\n this.setProgress(this.progress);\r\n }\r\n if (options.level != null) {\r\n this.setLevel(this.level);\r\n }\r\n }\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 progressBar.prototype.getProgress = function () {\r\n return this.progress;\r\n };\r\n\r\n progressBar.prototype.setLevel = function (level) {\r\n if (level == \"default\") {\r\n $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-hightlight ui-progressbar-warning\");\r\n $(this.progressBar).addClass(\"ui-progress\");\r\n } else if (level == \"success\") {\r\n $(this.progressBar).removeClass(\"ui-progressbar-highlight ui-progressbar-warning\");\r\n $(this.progressBar).addClass(\"ui-progressbar-success\");\r\n } else if (level == \"highlight\") {\r\n $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-warning\");\r\n $(this.progressBar).addClass(\"ui-progressbar-highlight\");\r\n } else if (level == \"warning\") {\r\n $(this.progressBar).removeClass(\"ui-progressbar-success ui-progressbar-highlight\");\r\n $(this.progressBar).addClass(\"ui-progressbar-warning\");\r\n }\r\n };\r\n\r\n ipu.progressBar = function (slt, options) {\r\n return new progressBar(slt, options);\r\n };\r\n})(ipu || window, jQuery);\r\n\n(function (ipu, $, iScroll) {\r\n\r\n // 扩展参数,iscroll组件的参数选项\r\n // 扩展参数,用户直接在页面上自定好,顶端和底部加载html\r\n // 设置上下条件长度,或计算函数\r\n // 处理resize的问题,用户主动调用refresh??\r\n // 底部启用或停用时,应该刷新组件iscroll高度\r\n // 顶部正在加载时,自动停止底端加载状态,停用底部加载,停用底部加载时,可以不隐藏,变性成显示不见,或者隐藏,然后修改iscroll参数\r\n\r\n Refresh.prototype.defaultOptions = {\r\n bottomLoadFun: null, // 底部加载处理函数\r\n topLoadFun: null, // 顶部加载处理函数\r\n initEnableTop: true, // 初始时启用刷新,有时用户并不想启用\r\n initEnableBottom: true, // 初始时启用加载更多,用时用户并不想启用\r\n bottomLoadHtml: '<div class=\"ui-refresh-bottom\"><span class=\"ui-refresh-loading\"></span></div>', // 默认底部加载显示内容\r\n topLoadHtml: '<div class=\"ui-refresh-top\"><span class=\"ui-refresh-loading\"></span><div class=\"ui-refresh-arrow\"></div></div>',\r\n // 默认顶部加载显示内容,最上层节点class有下面三个阶段变化\r\n // 默认阶段,不是顶部加载状态时,且拖动时未达到加载距离,无特殊class,移除ui-refresh-top-loading\r\n // 拖动达到加载距离,则增加class:ui-refresh-toload\r\n // 加载中,则增加class:ui-refresh-top-loading,移除class:ui-refresh-toload\r\n bottomAddLen: 0, // 底部提前加载距离,单位px\r\n iScrollOptions:{} // 主要是用来接收外面一些函数,不能传递回调的相关函数如refresh,也可在本地函数调用完后,再调用参数的函数,不推荐\r\n };\r\n\r\n function Refresh(slt, options) {\r\n this.options = $.extend({}, this.defaultOptions, options);\r\n this.el = $(slt).get(0);\r\n this._initBottomAndTop();\r\n var me = this;\r\n\r\n this.iScrollOptions = {\r\n onScrollMove: function (e) {\r\n if (me.topEnable && !me.topLoading) { // 顶部是松手才加载\r\n if (this.y >= me.topPullOffset && !me.topEl.hasClass('ui-refresh-toload')) { // 达到刷新距离,更新显示状态\r\n me.topEl.addClass('ui-refresh-toload');\r\n } else if (this.y < me.topPullOffset && me.topEl.hasClass('ui-refresh-toload')) { // 从达到刷新距离更新为未达到距离,更新显示状态\r\n me.topEl.removeClass('ui-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.iScrollOptions = $.extend({}, this.options.iScrollOptions, this.iScrollOptions);\r\n this.iScroll = new iScroll(this.el, this.iScrollOptions);\r\n this._checkContentLoading();\r\n }\r\n\r\n Refresh.prototype._initBottomAndTop = function () {\r\n this.scrollEl = $(\">.ui-refresh-wrapper\" ,this.el);\r\n this.bottomEl = $(this.options.bottomLoadHtml).appendTo(this.scrollEl);\r\n this.topEl = $(this.options.topLoadHtml).prependTo(this.scrollEl);\r\n\r\n this.topPullOffset = this.topEl.outerHeight();\r\n this.bottomPullOffset = this.bottomEl.outerHeight() + this.options.bottomAddLen; // 增加100;最好配一个额外参数\r\n\r\n this.topLoading = false; // 顶部正在载加载\r\n this.bottomLoading = false; // 底部正在加载\r\n this.bottomEnable = this.options.initEnableBottom && !!this.options.bottomLoadFun;\r\n this.topEnable = this.options.initEnableTop && !!this.options.topLoadFun;\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 && !this.bottomLoading) {\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 && !this.topLoading) {\r\n if (this.topEl.hasClass('ui-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.iScroll.maxScrollY >= -this.bottomPullOffset){ // 此处要计算底端的高度\r\n this._startBottomLoading();\r\n }\r\n };\r\n\r\n // 开始底部加载\r\n Refresh.prototype._startBottomLoading = function () {\r\n if (this.bottomEnable && !this.bottomLoading) {\r\n this.bottomLoading = true;\r\n this.options.bottomLoadFun(); // 刷新当前索引加载更多的数据\r\n }\r\n };\r\n\r\n // 开始顶部加载\r\n Refresh.prototype._startTopLoading = function () {\r\n if (this.topEnable && !this.topLoading) {\r\n this.topLoading = true;\r\n this.topEl.removeClass('ui-refresh-toload').addClass('ui-refresh-top-loading');\r\n this.iScroll.minScrollY = this.iScroll.minScrollY + this.topPullOffset;\r\n this.options.topLoadFun(); // 刷新当前索引加载更多的数据\r\n }\r\n };\r\n\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 Refresh.prototype.endTopLoading = function () {\r\n this.topEl.removeClass('ui-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 // 设置顶部加载是否可用,true可用,否则不可用\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 // 设置底部加载是否可用,true可用,否则不可用\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 // 只有在内容发生变更时,但是又没有触发调用end相关方法时,使用此方法更新高度信息\r\n // 或者组件在一开始未显示??\r\n // 刷新会移除拖动中状态\r\n Refresh.prototype.refresh = function () {\r\n this.iScroll.refresh();\r\n this._checkContentLoading();\r\n };\r\n\r\n ipu.refresh = function (slt, optoins) {\r\n return new Refresh(slt, optoins);\r\n };\r\n\r\n})(ipu || window, jQuery, iScroll);\r\n\n// Tab\r\n(function (ipu, $) {\r\n function Tab(holder, options) {\r\n this.el = $(holder).get(0);\r\n this.titleItems = $(\".ui-tab-title:first>li\", this.el);\r\n this.bodyWrapper = $(\".ui-tab-body-wrapper:first\", this.el);\r\n this.contentItems = $(\">li\", this.bodyWrapper);\r\n\r\n this.options = $.extend({}, this.defaultOptions, options);\r\n this.itemSize = this.contentItems.size();\r\n this.fixed = $(this.el).is(\".ui-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\r\n Tab.prototype.defaultOptions = {\r\n callBack: null // 回调函数,tab切换时回调函数\r\n };\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 }\r\n this.contentItems.eq(index).addClass(\"ui-active\").siblings().removeClass(\"ui-active\");\r\n this.titleItems.eq(index).addClass(\"ui-active\").siblings().removeClass(\"ui-active\");\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 = this.index;\r\n\r\n if (this.options.callBack) {\r\n this.options.callBack(index, this.lastIndex);\r\n }\r\n };\r\n\r\n ipu.tab = function (slt, options) {\r\n return new Tab(slt, options);\r\n };\r\n})(ipu || window, jQuery);\r\n\r\n\n/*===========================\r\nDevice/OS Detection\r\n===========================*/\r\n// from sui,但IPU框架的ua不是这样的\r\n;(function (ipu, $) {\r\n \"use strict\";\r\n var device = {}; // Classes\r\n var classNames = [];\r\n var ua = navigator.userAgent;\r\n console.log('device');\r\n\r\n // 这中针对ipu框架的情况,待测试\r\n if(ua.match(/ipumobile/i)){\r\n device.ios = !!ua.match(/ios/i);\r\n device.android = !!ua.match(/android/i);\r\n }else{\r\n var android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/);\r\n var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\r\n var ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\r\n var iphone = !ipad && ua.match(/(iPhone\\sOS)\\s([\\d_]+)/);\r\n\r\n device.ios = device.android = device.iphone = device.ipad = device.androidChrome = false;\r\n\r\n // Android\r\n if (android) {\r\n device.os = 'android';\r\n device.osVersion = android[2];\r\n device.android = true;\r\n device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;\r\n }\r\n if (ipad || iphone || ipod) {\r\n device.os = 'ios';\r\n device.ios = true;\r\n }\r\n // iOS\r\n if (iphone && !ipod) {\r\n device.osVersion = iphone[2].replace(/_/g, '.');\r\n device.iphone = true;\r\n }\r\n if (ipad) {\r\n device.osVersion = ipad[2].replace(/_/g, '.');\r\n device.ipad = true;\r\n }\r\n if (ipod) {\r\n device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;\r\n device.iphone = true;\r\n }\r\n // iOS 8+ changed UA\r\n if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {\r\n if (device.osVersion.split('.')[0] === '10') {\r\n device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];\r\n }\r\n }\r\n\r\n // Webview\r\n device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i);\r\n\r\n // Minimal UI\r\n if (device.os && device.os === 'ios') {\r\n var osVersionArr = device.osVersion.split('.');\r\n device.minimalUi = !device.webView &&\r\n (ipod || iphone) &&\r\n (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7) &&\r\n $('meta[name=\"viewport\"]').length > 0 && $('meta[name=\"viewport\"]').attr('content').indexOf('minimal-ui') >= 0;\r\n }\r\n\r\n // Check for status bar and fullscreen app mode\r\n var windowWidth = $(window).width();\r\n var windowHeight = $(window).height();\r\n device.statusBar = false;\r\n if (device.webView && (windowWidth * windowHeight === screen.width * screen.height)) {\r\n device.statusBar = true;\r\n }\r\n else {\r\n device.statusBar = false;\r\n }\r\n\r\n\r\n // Pixel Ratio\r\n device.pixelRatio = window.devicePixelRatio || 1;\r\n classNames.push('pixel-ratio-' + Math.floor(device.pixelRatio));\r\n if (device.pixelRatio >= 2) {\r\n classNames.push('retina');\r\n }\r\n\r\n // OS classes\r\n if (device.os) {\r\n classNames.push(device.os, device.os + '-' + device.osVersion.split('.')[0], device.os + '-' + device.osVersion.replace(/\\./g, '-'));\r\n if (device.os === 'ios') {\r\n var major = parseInt(device.osVersion.split('.')[0], 10);\r\n for (var i = major - 1; i >= 6; i--) {\r\n classNames.push('ios-gt-' + i);\r\n }\r\n }\r\n\r\n }\r\n // Status bar classes\r\n if (device.statusBar) {\r\n classNames.push('with-statusbar-overlay');\r\n }\r\n else {\r\n $('html').removeClass('with-statusbar-overlay');\r\n }\r\n\r\n\r\n // keng..\r\n device.isWeixin = /MicroMessenger/i.test(ua);\r\n }\r\n\r\n // Add html classes\r\n if (classNames.length > 0){\r\n $('html').addClass(classNames.join(' '));\r\n }\r\n\r\n ipu.device = device;\r\n})(ipu || window, jQuery);\r\n\n\n // 初始化代码\n jQuery(function () {\n FastClick.attach(document.body);\n });\n\n return ipu;\n }\n\n // todo:可以添加一个和其它库的适配处理,\n // 这里假设第三方库,jquery,iScroll,Hammer的史称已经固定\n if ( typeof define === \"function\" && define.amd ) {\n define(['jquery', 'iScroll', 'Hammer', 'FastClick'], function (jquery, iscroll, hammer, FastClick) {\n return window.ipu = setup(jquery, iscroll, hammer, FastClick);\n });\n } else {\n window.ipu = setup(window.jQuery, window.iScroll, window.Hammer, window.FastClick);\n }\n})();\n\r\n//# sourceMappingURL=ipu.js.map\r\n"]}
android-share - Nuosi Git Service

ipu的trunk版的android工程和服务端工程。

yangbiao 46fac9abd0 Merge branch 'master' of http://114.215.100.48:3000/ipu/android-share.git 9 years ago
display-client 2ecd53fe40 KEY失效 9 years ago
display-server 604b415dac 优化Tab组件 9 years ago
ipu-client dfc4eaba5e a 9 years ago
ipu-server 5a060e8748 luajava 9 years ago
multiple-client 42c42ff8b7 1 9 years ago
multiple-server 03c8b3605e 初始化 9 years ago
push-server cdba4f5dae 去掉bin目前 9 years ago
wade-mobile-common 8f43fa2c5a 解决dataRequest的bug 9 years ago
wade-mobile-func 1f191c2a19 初始化 10 years ago
wade-mobile-lib 8aa85d121f 初始化 10 years ago
wade-mobile-library dee1305807 1 9 years ago
wade-mobile-ui 1f191c2a19 初始化 10 years ago
.classpath c49fe6eca6 1 9 years ago
README.md a0eac80a47 bb 9 years ago

README.md

android-share

ipu的trunk版的android工程和服务端工程。

android-share - Nuosi Git Service

ipu的trunk版的android工程和服务端工程。

additionnal.jar 45KB

android-share - Nuosi Git Service

ipu的trunk版的android工程和服务端工程。

leijie 8b1bd636d6 merge 8 年之前
..
res 37966b4adc 初始化能力开放平台Demo 8 年之前
src 37966b4adc 初始化能力开放平台Demo 8 年之前
AndroidManifest.xml 8b1bd636d6 merge 8 年之前