0

我已经建立了一个有效的多步骤表单,但它的编码不是很“优雅”,所以我征求您的意见以使其更高效,我在这里只放了 3 个步骤中的 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
4

3 回答 3

0

伙计,我希望你看看好的 js 库 - 淘汰所有此类节目,隐藏功能和表单输入,复选框,单选按钮修改。

于 2013-09-14T13:20:38.537 回答
0

如果您使用图像来设置单选按钮的样式,我建议您将图像组合成Sprite,然后使用 css 使用input[type=radio]:checked选择器移动图像的背景位置。不需要javascript。

例如- 您将两个图像组合成一个 100 像素宽的图像,每个图像宽 50 像素。然后设置复选框的样式...

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;
于 2013-09-14T13:23:48.033 回答
0

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

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

这是一个例子。<input>hasposition: absolute因此可以应用该 属性clip来隐藏它,并且它不会影响其父级的内容框,该内容框具有relative包含它的位置。

我用过background-color,但你可以把它换成你的图片网址,或者按照rob-gordon 的回答background-position中的建议更改精灵的。

正如您在第二组无线电输入中看到的那样,您仍然可以在标签内添加可见的标签文本。

于 2013-09-17T02:46:33.220 回答