/**
@Name : layui.step 基于layui的步骤条面板
@Author:hsianglee
@License:MIT
*/
layui.define(["jquery"], function (exports) {
var $ = layui.jquery;
function Step(option) {
this.option=option; // 获取传入的数据
this.elem=option.elem;
// this.methods=option.methods?option.methods:"";
this.title=option.title?option.title:[];
this.description=option.description?option.description:[];
this.canIconClick=option.canIconClick?option.canIconClick:false;
this.isOpenStepLevel=option.isOpenStepLevel?option.isOpenStepLevel:false;
this.len=0; // 页面个数
this.currentStep=(option.currentStep && option.currentStep>=1)?option.currentStep:1; // 当前走到第几步
this.disabledStep=[];
this.finalStep=1; // 当前走到最远的步骤
this.parameterInit();
this.domRender();
this.init();
this.openStepLevel();
this.changeStep();
}
Step.prototype={
constructor: Step,
// 初始化参数数据
parameterInit: function() {
var self=this;
this.len=$(this.elem).find(".layui-step-content-item").length; // 页面个数
// 不传title参数
if(this.title.length<=0){
$(this.elem).find(".layui-step-content-item").each(function(index,val) {
self.title.push("第"+(index+1)+"步");
})
}
if(this.len!==this.title.length){
throw "title参数长度与页面长度不匹配";
}
// 不传description参数
if(this.description.length<=0){
$(this.elem).find(".layui-step-content-item").each(function(index,val) {
self.description.push("");
})
}
if(this.len!==this.description.length){
throw "description参数长度与页面长度不匹配";
}
// 若当前步超过最大步,则默认为最后一步
this.currentStep=this.currentStep>=this.len?this.len:this.currentStep;
},
domRender: function() {
var self=this;
var titleStr='
'+
'
'+
'
'+
'1'+
'
'+
'
'+
this.title[0]+
'
'+
'
'+
this.description[0]+
'
'+
'
';
for(var i=1;i
'+
''+
''+(i+1)+''+
'
'+
''+
this.title[i]+
'
'+
''+
this.description[i]+
'
'+
' ';
};
titleStr+=''+
'
'+
''+this.len+''+
'
'+
'
'+
this.title[this.title.length-1]+
'
'+
'
'+
this.description[this.title.length-1]+
'
'+
'
'+
''
$(this.elem).prepend(titleStr);
// 生成三角
$(this.elem).find(".layui-step-content-item").each(function(index,val) {
$(this).append("");
})
},
// 添加样式
init: function() {
var self=this;
this.disabledStep.forEach(function(val){
$(self.elem).find(".layui-step-title-item").eq(val-1).addClass("step-disabled");
})
$(this.elem).find(".layui-step-title-item").eq(this.currentStep-1).addClass("step-current");
$(this.elem).find(".layui-step-content-item").eq(this.currentStep-1).show();
if(this.currentStep<2) return;
for(var i=this.currentStep-2;i>=0;i--){
$(this.elem).find(".layui-step-title-item").eq(i).addClass("step-finish");
}
},
// 恢复默认样式
reInit: function() {
$(this.elem).find(".layui-step-title-item").each(function(index,val) {
$(val).removeClass("step-disabled");
})
$(this.elem).find(".layui-step-title-item").eq(this.currentStep-1).removeClass("step-current");
$(this.elem).find(".layui-step-content-item").eq(this.currentStep-1).hide();
if(this.currentStep<2) return;
for(var i=this.currentStep-2;i>=0;i--){
$(this.elem).find(".layui-step-title-item").eq(i).removeClass("step-finish");
}
},
// 给上面的icon添加事件
changeStep: function() {
var self=this;
this.canIconClick?(function() {
$(self.elem).on("click",".layui-step-title-item .step-icon",function() {
var index=$(this).parent(".layui-step-title-item").index()+1;
// 判断点击的是否为disabled
if($.inArray(index, self.disabledStep) === -1){
self.goStep(index);
}
})
})():"";
},
// 是否严格按照步骤条顺序执行步骤
openStepLevel: function() {
var self=this;
this.isOpenStepLevel?(function() {
// 如果开启这一项,则默认关闭icon点击事件
self.canIconClick=false;
$(self.elem).off().on("click",".layui-step-title-item .step-icon",function() {
var index=$(this).parent(".layui-step-title-item").index()+1;
// 判断如果当前点击的步骤超过已走过的最大步,则不跳转
if(index>self.finalStep){
return;
}
// 判断点击的是否为disabled
if($.inArray(index, self.disabledStep) === -1){
self.goStep(index);
}
})
})():"";
},
// 跳转第几步
goStep: function(i) {
if((i<1 || i>this.len)){
throw "goStep函数参数不在范围内";
}
// 判断当前页是否禁用,即i是否在数组中
if($.inArray(i, this.disabledStep) === -1){
this.reInit();
this.currentStep=i;
this.init();
}else{
throw "该页已禁用";
}
},
// 跳到第一步
goFirst: function() {
this.goStep(1);
},
// 跳到最后一步
goLast: function() {
this.goStep(this.len);
this.finalStep=this.len;
this.openStepLevel();
},
// 跳到上一步
prev: function () {
if(this.currentStep<=1){
return;
}
this.reInit();
// 先保存当前位置,若前面的全都已经禁用,则可以回到当前位置
var origin=this.currentStep;
this.PrevGo(origin);
},
PrevGo: function(origin) {
this.currentStep--;
// 判断前面的是否全都已经禁用
if(this.currentStep<1){
this.currentStep=origin;
this.init();
return;
}
// 判断当前页是否禁用
if($.inArray(this.currentStep, this.disabledStep) === -1){
this.init();
}else{
this.PrevGo(origin);
}
},
// 跳到下一部
next: function () {
if(this.currentStep>=this.len){
return;
}
this.reInit();
// 先保存当前位置,若后面的全都已经禁用,则可以回到当前位置
var origin=this.currentStep;
this.nextGo(origin);
},
nextGo: function(origin) {
if(this.currentStep===this.finalStep){
// 更新最远步
this.finalStep++;
this.openStepLevel();
}
this.currentStep++;
// 判断后面的是否全都已经禁用
if(this.currentStep>this.len){
this.currentStep=origin;
this.init();
return;
}
// 判断当前步是否禁用
if($.inArray(this.currentStep, this.disabledStep) === -1){
this.init();
}else{
this.nextGo(origin);
}
},
// 禁用某一步
disabled: function (j) {
if(j<=this.currentStep){
throw "已经走过的步骤不能禁用";
}
// 当前步不存在则加入数组,否存重复添加
if($.inArray(j,this.disabledStep)===-1){
this.disabledStep.push(j);
}
//默认为起始从第一步开始,若第一步为disabled,则从前往后找到第一个不是disabled的作为第一步
for(var i=this.currentStep;i