123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332 |
- /**
-
- @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='<div class="layui-step-title layui-clear">'+
- '<div class="layui-step-title-item step-first" style="width: '+(100/this.len)+'%;">'+
- '<div class="step-icon">'+
- '<i>1</i>'+
- '</div>'+
- '<div class="step-text">'+
- this.title[0]+
- '</div>'+
- '<div class="step-description">'+
- this.description[0]+
- '</div>'+
- '</div>';
- for(var i=1;i<this.title.length-1;i++){
- titleStr+='<div class="layui-step-title-item" style="width: '+(100/this.len)+'%;">'+
- '<div class="step-icon">'+
- '<i>'+(i+1)+'</i>'+
- '</div>'+
- '<div class="step-text">'+
- this.title[i]+
- '</div>'+
- '<div class="step-description">'+
- this.description[i]+
- '</div>'+
- '</div>';
- };
- titleStr+='<div class="layui-step-title-item step-last" style="width: '+(100/this.len)+'%;">'+
- '<div class="step-icon">'+
- '<i>'+this.len+'</i>'+
- '</div>'+
- '<div class="step-text">'+
- this.title[this.title.length-1]+
- '</div>'+
- '<div class="step-description">'+
- this.description[this.title.length-1]+
- '</div>'+
- '</div>'+
- '</div>'
- $(this.elem).prepend(titleStr);
- // 生成三角
- $(this.elem).find(".layui-step-content-item").each(function(index,val) {
- $(this).append("<span class='content-item-before' style='left: calc("+((100/(self.len*2))+((100*index)/self.len))+"% - 10px);'></span>");
- })
- },
- // 添加样式
- 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<this.len;i++){
- if($.inArray(i, this.disabledStep) === -1){
- this.reInit();
- this.currentStep=i;
- this.init();
- i=this.len+1;
- }
- }
-
- },
- // 解除禁用
- abled: function (j) {
- if(j<=this.currentStep){
- throw "已经走过的步骤不能解除禁用";
- }
- // 删除数组数据
- var tem=this.disabledStep.concat();
- if($.inArray(j, tem) !== -1){
- this.disabledStep.splice($.inArray(j, tem),1);
- }
- this.reInit();
- this.init();
- }
- }
- var stepObj; // new的对象,作为内部变量
- var step={
- option: "",
- currentStep: 1,
- render: function(option) {
- var self=this;
- this.option=option || {};
- this.option.elem?"":(function() {
- throw '缺少参数,需要传入elem元素';
- })();
- !$(this.option.elem)[0]?(function() {
- throw '没有找到'+ self.option.elem +'元素';
- })():"";
- stepObj=new Step(this.option);
- this.currentStep=stepObj.currentStep;
- },
- goStep: function(i) {
- if(typeof i !== "number"){
- throw 'goStep参数不合法';
- }
- stepObj.goStep(i);
- this.currentStep=stepObj.currentStep;
- },
- goFirst: function() {
- stepObj.goFirst();
- this.currentStep=stepObj.currentStep;
- },
- goLast: function() {
- stepObj.goLast();
- this.currentStep=stepObj.currentStep;
- },
- prev: function() {
- stepObj.prev();
- this.currentStep=stepObj.currentStep;
- },
- next: function() {
- stepObj.next();
- this.currentStep=stepObj.currentStep;
- },
- disabled: function(i) {
- stepObj.disabled(i);
- },
- abled: function(i) {
- stepObj.abled(i);
- }
- }
-
- exports('step', step);
- })
|