vue-weui-expand
Version:
WeUI 的轻量级 js 封装
202 lines (166 loc) • 6.85 kB
JavaScript
import {_Substitute} from '../comm/comm.js'
function show({data,setValue=[],yes,no,shadeClose=true}={}){
let pickteitem=0;
let options=[]
pickteitem= data.length;
for(let i=0;i<pickteitem;i++){
options=[...options,
{
init_location: 102,
pull_location_y: 0,
styleObject:"transform:translate3d(0px, 102px, 0px);transition:all 0s ease 0s;"
}
];
}
//默认值
for(let i=0;i<setValue.length;i++){
if(i>data.length-1){
break;
}
let tp=102;
for(let n=0; n<data[i].length;n++){
if(setValue[i]==data[i][n].value){
options[i].styleObject='transform:translate3d(0px, '+tp+'px, 0px);transition:all 0.3s ease 0s';
options[i].init_location=tp;//记录最后的位置,也是下一次的起始位置
break;
}else{
tp-=34;
}
}
}
let tpl_itemBaseHtml=`
<div class="weui-picker__group" data-index="{index}">
<div class="weui-picker__mask" ></div>
<div class="weui-picker__indicator"></div>
<div class="weui-picker__content" style="{styleObject}">{items}</div>
</div>
`;
let tpl_itemHtml='<div class="weui-picker__item" >{text}</div>';
let r_itemHtml='';
for(let i=0; i<pickteitem;i++){
let itemsHtml='';
if(data[i]!=undefined){
data[i].forEach(el=>{
itemsHtml+=_Substitute(tpl_itemHtml,{text:el.text});
});
}
let html=_Substitute(tpl_itemBaseHtml,{styleObject:options[i].styleObject,items:itemsHtml,index:i});
r_itemHtml+=html;
}
var innerHtml=`
<div class="weui-mask weui-animate-fade-in" ></div>
<div class="weui-picker weui-animate-slide-up">
<div class="weui-picker__hd">
<a data-action="cancel" class="weui-picker__action" >取消</a>
<a data-action="select" class="weui-picker__action" >确定</a>
</div>
<div class="weui-picker__bd">
${r_itemHtml}
</div>
</div>
`;
let newNode = window.document.createElement("div");
newNode.id=Number(Math.random().toString().substr(3,length) + Date.now()).toString(36);
newNode.innerHTML = innerHtml;
window.document.getElementsByTagName('body')[0].appendChild(newNode);
//动态生成document后,给相关的document注册事件
let group= newNode.getElementsByClassName('weui-picker__group');
for(let i=0;i<group.length;i++){
group[i].addEventListener('touchstart',()=>{
let index=event.currentTarget.dataset.index;
options[index].pull_location_y=event.touches[0].clientY;
},false);
group[i].addEventListener('touchmove',()=>{
let index=event.currentTarget.dataset.index;
let tp=event.touches[0].clientY-options[index].pull_location_y+options[index].init_location;
//下/上拉动的时候,超出列表范围,最多空白34px
if(tp>136){
tp=136;
}
let len= data[index].length;
if(len>4){
if(tp<-((len-4+1)*34)){
tp=-((len-4+1)*34);
}
}else{
if(tp<102-((len)*34)){
tp=102-((len)*34);
}
}
options[index].styleObject='transform:translate3d(0px, '+tp+'px, 0px);transition:all 0s ease 0s';
newNode.getElementsByClassName('weui-picker__content')[index].style=options[index].styleObject;
},false);
group[i].addEventListener('touchend',()=>{
let index=event.currentTarget.dataset.index;
let tp=event.changedTouches[0].clientY-options[index].pull_location_y+options[index].init_location;
//下/上拉超同列表范围不得超过34px
if(tp>102){
tp=102;
}
let len= data[index].length;
if(len>4){
if(tp<-((len-4)*34)){
tp=-((len-4)*34);
}
}else{
if(tp<102-((len-1)*34)){
tp=102-((len-1)*34);
}
}
//处理必须选中一项
if(tp%34!=0)
{
if(tp%34>17)
{
tp=(parseInt(tp/34+1))*34;
}else{
tp=parseInt(tp/34)*34;
}
}
//动画
options[index].styleObject='transform:translate3d(0px, '+tp+'px, 0px);transition:all 0.3s ease 0s';
newNode.getElementsByClassName('weui-picker__group')[index].getElementsByClassName('weui-picker__content')[0].style=options[index].styleObject;
options[index].init_location=tp;//记录最后的位置,也是下一次的起始位置
},false);
}
let remove=function(){
let up= newNode.getElementsByClassName('weui-animate-fade-in');
if(up.length>0){
up[0].setAttribute('class','weui-mask weui-animate-fade-out');
}
let down= newNode.getElementsByClassName('weui-animate-slide-up');
if(down.length>0){
down[0].setAttribute('class','weui-picker weui-animate-slide-down');
}
setTimeout(function(){ window.document.getElementsByTagName('body')[0].removeChild(newNode);},300);
}
//回调事件注册
newNode.getElementsByClassName('weui-picker__action')[0].addEventListener('click',()=>{
remove();
if(no!=undefined)no();
},false);
newNode.getElementsByClassName('weui-mask')[0].addEventListener('click',()=>{
if(shadeClose){
remove();
if(no!=undefined)no();
}
},false);
newNode.getElementsByClassName('weui-picker__action')[1].addEventListener('click',()=>{
let items=[];
if(data.length>0){
options.forEach((el,index)=>{
if(index<data.length){
let elindex= Math.abs((options[index].init_location-102))/34;
let item= data[index][elindex];
items=[...items,item];
}
});
}
remove();
if(yes!=undefined)yes(items);
},false);
}
function install(Vue){
Vue.prototype.multiopicker={show};
}
export {show,install}