UNPKG

tfp

Version:

A Web UI framework for TaskBuilder

173 lines (163 loc) 6.99 kB
function PopupList() { this.lists = null; this.cb = null; this.touchStartInfo = null; this.show = function(lists, cb) { this.lists = lists; if(cb) this.cb = cb; $("body").append("<div class=\"tfp-mask-div\"></div>"); $("body").append("<div class=\"tfp-popuplist\">" +"<div class=\"tfp-popuplist-content\"></div>" +"<div class=\"tfp-popuplist-touch\"></div>" +"<div class=\"tfp-popuplist-bottom\">" +" <div onclick=\"window.popupList.onOk()\">确定</div>" +" <div onclick=\"window.popupList.close()\">取消</div>" +"</div>" +"</div>"); for(var i=0;i<lists.length;i++) { var list = lists[i]; let width = "100%"; if(list.width) width = list.width; var listHtml = "<div class=\"tfp-popuplist-content-column\" " +"style=\"width:"+width+"; background-color: "+list.bgColor+";\">" +"<div class=\"tfp-popuplist-content-items\">"; let valOptionIndex = 0; if(list.options) { //上面加三个空白的选项,以便可以滚动显示第一条记录 listHtml += "<div class=\"tfp-popuplist-content-item\" data-value=\"\"></div>"; listHtml += "<div class=\"tfp-popuplist-content-item\" data-value=\"\"></div>"; listHtml += "<div class=\"tfp-popuplist-content-item\" data-value=\"\"></div>"; for(var j=0;j<list.options.length;j++) { let option = list.options[j]; if(typeof(option)=="string") { option = { value: option, text: option }; } if(option.value==list.value) valOptionIndex = j; let text = option.value; if(option.text) text = option.text; listHtml += "<div class=\"tfp-popuplist-content-item\" data-value=\"" +option.value+"\">"+text+"</div>"; } //下面加三个空白的选项,以便可以滚动显示最后一条记录 listHtml += "<div class=\"tfp-popuplist-content-item\" data-value=\"\"></div>"; listHtml += "<div class=\"tfp-popuplist-content-item\" data-value=\"\"></div>"; listHtml += "<div class=\"tfp-popuplist-content-item\" data-value=\"\"></div>"; } listHtml += "</div></div>"; $(".tfp-popuplist-content").append(listHtml); if(valOptionIndex>0) $(".tfp-popuplist-content-column").get(i).scrollTop = valOptionIndex*40; } for(var i=0;i<7;i++) { let style = ""; if(i==3) { style = "background:transparent;border-top: 1px solid #eeeeee;" +"border-bottom: 1px solid #eeeeee;"; } else { style = "background-color: #FFFFFF; opacity:"; if(i==0 || i==6) style += "0.9"; if(i==1 || i==5) style += "0.6"; if(i==2 || i==4) style += "0.3"; style += ";"; } style += "top:"+(i*40+10)+"px;"; $(".tfp-popuplist").append("<div class=\"tfp-popuplist-mask\" style=\""+style+"\"></div>"); } let that = this; let touchDiv = $(".tfp-popuplist-touch").get(0); touchDiv.addEventListener("touchstart", function(event) { that.onTouchStart(event); }); } this.onTouchStart = function(event) { var touch = event.targetTouches[0]; //touches数组对象获得屏幕上所有的touch,取第一个touch this.touchStartInfo = { x: touch.pageX, y: touch.pageY }; //取第一个touch的坐标值 for(var i=0;i<$(".tfp-popuplist-content-column").length;i++) { let divTmp = $($(".tfp-popuplist-content-column").get(i)); if(touch.pageX>divTmp.offset().left && touch.pageX<(divTmp.offset().left+divTmp.width())) { this.touchStartInfo.columnIndex = i; this.touchStartInfo.contentDiv = divTmp.get(0); this.touchStartInfo.scrollTop = divTmp.get(0).scrollTop; break; } } if(!this.touchStartInfo.contentDiv) return; let that = this; let touchDiv = $(".tfp-popuplist-touch").get(0); touchDiv.addEventListener("touchmove", function(event) { that.onTouchMove(event); }); touchDiv.addEventListener("touchend", function(event) { that.onTouchEnd(event); }); } this.onTouchMove = function(event) { //当屏幕有多个touch或者页面被缩放过,就不执行move操作 if(event.targetTouches.length > 1 || event.scale && event.scale !== 1) return; var touch = event.targetTouches[0]; let endPos = { x: touch.pageX - this.touchStartInfo.x, y: touch.pageY - this.touchStartInfo.y }; let touchType = Math.abs(endPos.x) < Math.abs(endPos.y) ? 1:0; //touchType为1时,表示纵向滑动,0为横向滑动 if(touchType === 1) { event.preventDefault(); //阻止触摸事件的默认行为,即阻止滚屏 this.touchStartInfo.contentDiv.scrollTop = this.touchStartInfo.scrollTop - endPos.y; } } this.onTouchEnd = function(event) { let touchDiv = $(".tfp-popuplist-touch").get(0); touchDiv.removeEventListener('touchmove', this.onTouchMove); touchDiv.removeEventListener('touchend', this.onTouchEnd); let contentDiv = this.touchStartInfo.contentDiv; let interval = 40 - contentDiv.scrollTop % 40; if(interval<=20) { contentDiv.scrollTop = contentDiv.scrollTop + interval; } else { contentDiv.scrollTop = contentDiv.scrollTop - contentDiv.scrollTop % 40; } let list = this.lists[this.touchStartInfo.columnIndex]; if(list.onChange) list.onChange(); } this.getColumnVal = function(colIndex) { let column = $(".tfp-popuplist-content-column").get(colIndex); let centerMaskDivOffset = $($(".tfp-popuplist-mask").get(3)).offset(); let itemIndex = column.scrollTop/40+3; let items = $(column).find(".tfp-popuplist-content-item"); let curItemCenterY = $(items.get(itemIndex)).offset().top+20; let upperItemCenterY = curItemCenterY-40; let belowItemCenterY = curItemCenterY+40; let item = items.get(itemIndex); if(upperItemCenterY>centerMaskDivOffset.top && upperItemCenterY<(centerMaskDivOffset.top+40)) { items.get(itemIndex-1); } else if(belowItemCenterY>centerMaskDivOffset.top && belowItemCenterY<(centerMaskDivOffset.top+40)) { items.get(itemIndex+1) } return $(item).attr("data-value"); } this.onOk = function() { if(this.cb) { let values = []; let columns = $(".tfp-popuplist-content-column"); let centerMaskDivOffset = $($(".tfp-popuplist-mask").get(3)).offset(); for(var i=0;i<columns.length;i++) { values.push(this.getColumnVal(i)); } this.cb(values); } this.close(); } this.close = function() { $(".tfp-mask-div").remove(); $(".tfp-popuplist").remove(); this.lists = null; this.cb = null; this.touchStartInfo = null; } } window.popupList = new PopupList();