使用jquery动态“下一步”和“上一步”

时间:2016-10-27 13:30:29

标签: javascript jquery arrays forms

以多步形式我在下面使用此代码转到我表单的下一部分或上一部分(只有一步是可见的,其他部分是隐藏的):

$(".next").click(function(){
   if (form.valid() === true){
        if ($('#one').is(":visible")){
            current_fs = $('#one');
            next_fs = $('#two');
        }else if($('#two').is(":visible")){
            current_fs = $('#two');
            next_fs = $('#three');
        }

   next_fs.show(); 
   current_fs.hide();
   }
 });

 $('#previous').click(function(){
    if($('#two').is(":visible")){
        current_fs = $('#two');
        next_fs = $('#one');
    }else if ($('#three').is(":visible")){
        current_fs = $('#three');
        next_fs = $('#two');
    }
    next_fs.show(); 
    current_fs.hide();
 });

如果我有一个3步表单,这段代码运行良好,但我想使用数组修改我的代码以转到下一步或上一步。

我尝试使用像var pages = ["#one","#two","#three"]这样的数组并使用,例如if ($(pages[0]).is(":visible"))代替if ($('#one').is(":visible"))

如何修改此代码以使其可扩展(例如,如果我想添加更多页面)

谢谢

4 个答案:

答案 0 :(得分:1)

这应该可行,我会添加一些错误处理,以防你的页面数组中不存在下一个或上一个索引。

$('#next').click(function(){
    if(form.valid() === true){
        var current_page = $(pages.join(",")).find(':visible');
        var current_index = pages.indexOf('#'+current_page.attr('id');
        current_page.hide();
        $(pages[current_index+1]).show();
    }
});
$('#previous').click(function(){
    var current_page = $(pages.join(",")).find(':visible');
    var current_index = pages.indexOf('#'+current_page.attr('id');
    current_page.hide();
    $(pages[current_index-1]).show();
});

答案 1 :(得分:1)

我已更新我的代码,请检查一下。这是工作。我对jquery代码做了一些更改。请使用它。



   var form = $("#form");
         var pages = ["#one","#two","#three","#four","#five"];
         $(".next").click(function(){
            if (form.valid() === true){ 
         	   var temp = 0;
         	   var nextElementFound = false;
         	   pages.forEach(function(element) { 
         			temp++;
                     if ($(element).is(":visible")){ 
         		        current_fs =$(element);
         				if(pages.length > temp){
         				next_fs =$(pages[temp]);
         				nextElementFound = true;
         				}
         			}
                 }); 
         		if(nextElementFound){
                 next_fs.show(); 
                 current_fs.hide();
         		}
            }
          });
         
          $('#previous').click(function(){
             var temp = 0;
         	var previousElementFound = false;
         	pages.forEach(function(element) { 
         			 if ($(element).is(":visible")){ 
         		        current_fs =$(element);
         				if(temp != 0){
         				previousElementFound= true;
         				next_fs =$(pages[temp-1]);
         				}
         			}
             temp++;
             }); 
         	if(previousElementFound){
             next_fs.show(); 
             current_fs.hide();
         	}
          });

 #previous {
      border: 1px solid;
      float: left;
      margin-right: 10px;
      margin-top: 10px;
      padding: 10px;
      }
      .next {
      border: 1px solid;
      float: left;
      margin-left: 10px;
      margin-top: 10px;
      min-width: 50px;
      padding: 10px;
      text-align: center;
      }
      .customElement {
      background-color: gray;
      border: 1px solid;
      color: white;
      font-size: 35px;
      min-height: 30px;
      padding: 10px;
      text-align: center;
      width: 148px;
      }

<script
         src="https://code.jquery.com/jquery-3.1.1.js"
         integrity="sha256-16cdPddA6VdVInumRGo6IbivbERE8p7CQR3HzTBuELA="
         crossorigin="anonymous"></script>
      <script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js"></script>
      <div>
         <form id="form">
            <div id ="one" class="customElement">
               one
            </div>
            <div id ="two" style="display:none" class="customElement">
               two
            </div>
            <div id ="three" style="display:none" class="customElement">
               three
            </div>
			<div id ="four" style="display:none" class="customElement">
               four
            </div>
			<div id ="five" style="display:none" class="customElement">
               five
            </div>
         </form>
         <div  id="previous" >
            Previous
         </div>
         <div class="next">
            Next
         </div>
      </div>
&#13;
&#13;
&#13;

答案 2 :(得分:1)

您不需要任何阵列来存储您的步骤。最好以HTML和CSS为基础。看看我的解决方案:JSFiddle

因此,当您添加新步骤时,根本不需要修改JavaScript。只需在HTML中添加新步骤:

<div class="step active">
    1
</div>
<div class="step">
    2
</div>
<div class="step">
    3
</div>
<div class="step">
    4
</div>

<button id="prev" disabled="disabled">Prev</button>
<button id="next">Next</button>

使用CSS隐藏除活动以外的所有步骤:

.step {
  display: none;
}

.step.active {
  display: block;
}

我的情况下的JavaScript:

var index = $(".step.active").index(".step"),
    stepsCount = $(".step").length,
    prevBtn = $("#prev"),
    nextBtn = $("#next");

prevBtn.click(function() {
    nextBtn.prop("disabled", false);

    if (index > 0) {
        index--;
        $(".step").removeClass("active").eq(index).addClass("active");
    };

    if (index === 0) {
        $(this).prop("disabled", true);
    }
});

nextBtn.click(function() {
    prevBtn.prop("disabled", false);

    if (index < stepsCount - 1) {
        index++;
        $(".step").removeClass("active").eq(index).addClass("active");
    };

    if (index === stepsCount - 1) {
        $(this).prop("disabled", true);
    }
});

答案 3 :(得分:0)

  1. 我会在活动页面上保留一个变量,而不是检查(&#39;#x&#39;)是否可见。

  2. 我会使用数字约定命名不同的表单部分,例如&#39;#form-part-1&#39;而不是&#39;#one&#39;。

  3. 最后我会做

    $(".next").click(function(){
       $("#form-part-"+activeIndex).hide();
       activeIndex++;
       $("#form-part-"+activeIndex).show(); 
    });
    
    $(".prev").click(function(){
       $("#form-part-"+activeIndex).hide();
       activeIndex--;
       $("#form-part-"+activeIndex).show(); 
    });