多步骤表单 - 在样式单选按钮之间切换

时间:2013-09-14 13:13:25

标签: html css forms jquery

我已经构建了一个可以工作的多步骤表单,但它不是非常“优雅”的编码,   所以我在问 为了您的建议,使其更有效率, 我在这里只放了2步,因为第一步 - 电子邮件名称等',与我的问题无关:

在每个步骤2和3中有2个样式单选按钮是和否供用户选择, 在每个步骤中,我需要在检查和取消选中样式图像之间切换,当然,这两者都很普遍 是的,没有检查图像会同时显示。

我知道默认/未设置样式的单选按钮行为会同时阻止两个选中的按钮 - 我可以在这里使用它来保存一些代码行吗?

html(index.php)

   <form method="post"  id="userForm" action="process_form.php">
<fieldset class="formFieldset">
   <div id="second_step" class="vanish">
      <div class="form  slide_two check_wrap">
         <div class="quizyes quizbtn">
           <img class="uncheck_pic  pic  one"  src="images/check_not.png">
           <img class="check_pic  pic  agree"  src="images/check_bgfull.png" style="display: none;">
           <h1 class="quizText">yes</h1>
        </div>
         <div class="quizno quizbtn">
           <img class="uncheck_pic   pic  two"  src="images/check_not.png">
           <img class="check_pic not  not_agree pic first_not"  src="images/check_bgfull.png" style="display: none;">
           <h1 class="quizText">no</h1>
         </div>
         <div id="feedback_wrap"><div class="feedback"></div></div>
         <div id="submit_wrap" >
            <input type="radio" class="yep decideOne" val ="1" name="yep"   style="display: none;"/>
            <input type="radio" class="nope decideOne" val ="2" name="nope"   style="display: none;"/>
         </div>
    </div></div>

                                          <!-- end of second step -->
    <!--  third step -->
  <div id="third_step" class="vanish">
    <div class="form check_wrap">
        <div class="quizyes quizbtn">
            <img class="uncheck_pic  pic  one"  src="images/check_not.png">
            <img class="check_pic pic  agree"  src="images/check_bgfull.png" style="display: none;">
            <h1 class="quizText">yes</h1>
           </div>
        <div class="quizno quizbtn">
            <img class="uncheck_pic pic two"  src="images/check_not.png">
            <img class="check_pic not not_agree pic second_not"  src="images/check_bgfull.png" style="display: none;">
            <h1 class="quizText">no</h1>
         </div>
        <div id="feedback_wrap"><div class="feedback"></div></div>
            <div id="submit_wrap">
                <input type="radio" class="yep decideTwo" val ="1" name="yep"   style="display: none;"/>
                <input type="radio" class="nope decideTwo" val ="2" name="nope"  style="display: none;"/>
                </div>                                  
        </div></div>
            <!-- end of third step -->

            </fieldset>
                <div id="submit_wrap">
            <input class="submit btn" type="button" name="submit_all" id="submit_all" value="" />
            </div>
                </form>

脚本

$(document).ready(function(){
    $(function() {
    $('.check_pic').hide();
    //original field values
    var isDecide= false;
    //toggle images and set values
$('.pic').on('click', function(event) {
    if ($(this).hasClass('uncheck_pic') && $(this).hasClass('one') ){ 
                     $(".yep").val('agree');
                    $(this).hide();
                    $(this).siblings('.check_pic').show();
                    $(".not").hide();
                    $(".two").show();
            } 
    else if ($(this).hasClass('uncheck_pic') && $(this).hasClass('two') ){ 
                    var isDecide = $(".nope").val('notagree');
                    $(this).hide();
                    $(this).siblings('.check_pic').show();
                    $('.agree').hide();
                     $(".one").show();
            }       
    else if ($(this).hasClass('check_pic') && $(this).hasClass('agree') ){ 
                    $(this).hide();
                    $(this).siblings('.uncheck_pic').show();
            }       
    else if ($(this).hasClass('check_pic') && $(this).hasClass('not_agree') ){ 
                    $(this).hide();
                    $(this).siblings('.uncheck_pic').show();
            }       
});
    // start the submit thing

    $('#submit_all').click(function() {
       if($('#second_step').is(":visible")) {
          $('.decideOne').removeClass('error valid');

       // prevent empty boxes and display a message

       if($('.one').is(":visible") && $('.two').is(":visible")) {
        $('.feedback').text('please select one').show();
        return false;
            }
               // case the user selects yes
       if($('.agree').is(":visible")) {
          $('.feedback').text('thank you for selecting yes').show();
             var isDecide = $(".yep").val();
             var name = $("#firstname").val();
             var phone = $("#phone").val();
             var email = $("#email").val();
              var dataString = 'user-details:name=' + name + ' phone=' + phone + ' email=' + email + ' decide=' +  isDecide ;
            $.ajax({
                type : "POST",
                url : "/",
                data: dataString,
                success : function(data) {
                console.log('data');
                $('#second_step').delay(1000).fadeOut(600, function() {
                $('#first_step').fadeIn(400);
                $('.feedback').hide();
            });
                }
            }); 
               }
                     // case the user selects no
        if($('.first_not').is(":visible")) {
            $(".yep").val();
            $(".nope").val();
            $('#second_step').fadeOut(600, function() {
                $('#third_step').fadeIn(600);
                $('.feedback').hide();
            });
        }
        return false;

// end second step

    } else if($('#third_step').is(":visible")) {

        $('.third_input').removeClass('error').removeClass('valid');
      // prevent empty boxes and display a message 
      if($('.quizyes .one').is(":visible") && $('.quizno .two').is(":visible")) {
        $('.feedback').text('please select one').show();
        return false;
    }
     // if decide yes then submit
      if($('.agree').is(":visible")) {
      $('.feedback').text('thank you for selecting yes').show();
         var isDecide = $(".yep").val();
         var name = $("#firstname").val();
         var phone = $("#phone").val();
         var email = $("#email").val();
          var dataString = 'user-details:name=' + name + ' phone=' + phone + ' email=' + email + ' decide=' +  isDecide ;
      $.ajax({
            type : "POST",
            url : "/",
            data: dataString,
            success : function(data) {
            console.log('data');
            $('#second_step').delay(1000).fadeOut(600, function() {
            $('#first_step').fadeIn(400);
            $('.feedback').hide();
                });
            }
                });//end ajax 
         return true;   
        }//end if agree is visible

        // if decide no then send message and quit
        if($(".second_not").is(":visible")) {
            $(".nope").val("no");
            $('.feedback').text('too bad bye bye').show();
                $('#third_step').fadeOut(3000, function() {
                $('#first_step').fadeIn(600);
                $('.feedback').hide();
            });
        }
                }
        // end third step

        });
        //end submit_all

    }) // general function
  }); // document ready

3 个答案:

答案 0 :(得分:0)

老兄,我希望你能看一下优秀的js图书馆 - 向所有那些表演者展示,隐藏功能和形式输入,复选框,无线电按钮修改。

答案 1 :(得分:0)

如果您正在使用图像来设置您的无线电按钮的样式,我建议将图像合并到Sprite并使用css使用输入[type = radio]移动图像的背景位置:选中选择器。没有必要的JavaScript。

例如 - 您将两个图像合并为一个100px宽的单个图像,每个图像的宽度为50px。然后设置复选框的样式......

input[type=radio].myCustomRadioButton {
  background: url(myRadioButtonSprite.png) 0 0;
}

input[type=radio].myCustomRadioButton:checked {
  background-position: -50px 0;
}

假设您的图像在精灵中水平排列,这会在检查无线电按钮时将无线电按钮的背景图像移动50px以显示已检查图像。

作为旁注,这样做将需要取消一些将自动发生的浏览器样式。表单元素的良好重置是从这些样式开始。

-webkit-appearance: none;
   -moz-appearance: none;
        appearance: none;

答案 2 :(得分:0)

请记住,如果您需要支持小于9的Internet Explorer版本,:checked伪选择器在纯CSS中不可用,您可能需要使用某些脚本。

在自定义单选按钮上侦听change事件,并根据该事件更新父元素。

Here's an example. <input>具有position: absolute,因此可以应用clip属性来隐藏它,它不会影响其父级的内容框,其父级relative位置包含它。

我使用了background-color,但您可以将其换成图片网址,或按rob-gordon's answer中的建议更改精灵的background-position

您仍然可以在第二组无线电输入中看到标签内添加可见标签文字。