【问题标题】:multistep form - toggle between styled radio buttons多步表单 - 在样式单选按钮之间切换
【发布时间】:2013-09-17 10:46:33
【问题描述】:

我已经构建了一个可以工作的多步骤表单,但它的编码不是很“优雅”, 所以我问 寻求您的建议以提高效率, 我在这里只放了 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

【问题讨论】:

    标签: html css forms jquery


    【解决方案1】:

    老兄,我希望你看看好的 js 库 - 淘汰所有此类显示、隐藏功能和表单输入、复选框、单选按钮修改。

    【讨论】:

      【解决方案2】:

      如果您使用图像来设置单选按钮的样式,我建议您将图像组合成 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;
      

      【讨论】:

      • 单选按钮而不是复选框:) 谢谢你,获得更高效的代码看起来是个好主意,但是精灵/背景位置在移动设备中的表现如何?因为它的响应式网站。第二件事如果我理解正确,如果选中一个单选按钮,它不会阻止像单选按钮的默认行为一样检查另一个?
      • 在此处查看浏览器兼容性下的移动选项卡:developer.mozilla.org/en-US/docs/Web/CSS/:checked
      • 哎呀,单选按钮。更新了它,但一切仍然适用
      • 再次感谢您花时间发布您的答案! ,它很有效,但它不回答我的单选按钮问题并创建跨浏览器问题。
      • 此方法不会产生跨浏览器问题。这是一种非常常用的方法。它怎么不回答你的问题?
      【解决方案3】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 2017-09-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多