【问题标题】:Show hide div and script based on radio button根据单选按钮显示隐藏 div 和脚本
【发布时间】:2013-08-05 01:07:13
【问题描述】:

我正在尝试在有条件的表单中实施验证。基本上,如果用户选择电子邮件单选选项,则需要电子邮件,或者如果选择电话,则需要电话字段。

到目前为止,我已经让这段代码正常工作,表单提交和验证工作正常。但是,如果我切换到电话,然后切换回电子邮件,则会加载验证,因此如果我没有填写这两个字段,则不会提交表单。

我是这样设置的,但基本上是在尝试这样做,所以如果选择了一个字段,则需要另一个字段。有更好的方法吗?

HTML:

<label>Method of Contact</label>
<label class="radio">
    <input type="radio" name="group" value="ck1" checked/>
    Email
</label><br />
<label class="radio"><input type="radio" name="group" value="ck2" />
    Phone
</label>
<div id="emaildisp">
    <label>Email</label> 
    <input id="emailv" name="email" type="email" />
</div>
<div id="phonedisp"> 
    <label>Phone</label> 
    <input id="phonev" name="phone" type="text" />
</div>

Javascript:

$(function()
{
    if (jQuery('input[value=ck2]:checked').length > 0)
    {
        jQuery('#phonedisp').show();
        jQuery('#emaildisp').hide();
        jQuery("#phonev").validate(
        {
            expression: "if (VAL) return true; else return false;",
            message: "Please enter your phone number"
        });  
    }
    else 
    {
        jQuery('#phonedisp').hide();
        jQuery('#emaildisp').show();
        jQuery("#emailv").validate(
        {
            expression: "if (VAL) return true; else return false;",
            message: "Please enter your email"
        }); 
    }

    jQuery('input[name=group]').change(function() 
    {
        var selected = jQuery(this).val();console.log(selected);
        if(selected == 'ck2')
        {
            jQuery('#phonedisp').show();
            jQuery('#emaildisp').hide();
            jQuery("#phonev").validate(
            {
                expression: "if (VAL) return true; else return false;",
                message: "Please enter your phone number"
            });  
        } 
        else 
        {
            jQuery('#phonedisp').hide();
            jQuery('#emaildisp').show();
            jQuery("#emailv").validate(
            {
                expression: "if (VAL) return true; else return false;",
                message: "Please enter your email"
            }); 
        }
    }); 
});

解决方案: 感谢下面的答案,我想出了解决方案。关键区别,我没有使用 jquery 验证插件,而是使用不同的验证脚本。所以我切换了,对于初学者,只需查找它,您只需在标题中添加指向脚本的链接。

接下来,我为表单指定了一个 ID,#myform。然后我有 ck1 和 ck2 单选按钮各自的 id,#ck1id 和 #ck2id。并且使用下面的代码,如果选择了单选按钮,那么根据选择的 id,下一部分成为需要验证。

<script type='text/javascript'>     
$(function(){
jQuery('input[name=group]').change(function() {
  var selected = jQuery(this).val();console.log(selected);
  if(selected == 'ck2'){
    jQuery('#phonedisp').show();
    jQuery('#emaildisp').hide();
    } else {
   jQuery('#phonedisp').hide();
   jQuery('#emaildisp').show();
  }
 }); 
jQuery('input[name=group]').triggerHandler('change');
});
</script>

<script>
$(function(){
    // validate signup form on keyup and submit
    $("#myform").validate({
        rules: {
            group: "required",
            email: 
                {
                    required: '#ck1id:checked',
                    email: true
                },
            phone: 
                {
                    required: '#ck2id:checked',
                    digits: true
                }
        },
        messages: {
            group: "Please select one",
            email: "Please enter your email.",
            phone: "Please enter your phone."
        }
    });
});
</script>

【问题讨论】:

    标签: javascript jquery forms


    【解决方案1】:

    您需要从其他不需要的字段中删除之前添加的验证。如果您需要电话从电子邮件中删除验证,反之亦然。

    您可以采用两种方式,删除验证或忽略验证。

    1. Removing the validation:
    
        jQuery("#emailv").rules('remove');
    
                or 
    
        jQuery("#phonev").rules('remove');
    
    2. Ignore validation:
    
        jQuery("#emailv").validate({
           ignore: "#emailv"
        });
    
                or
    
        jQuery("#phonev").validate({
           ignore: "#phonev"
        });
    

    检查这是否对您有帮助。

    【讨论】:

    • 谢谢!虽然在单选按钮之间来回切换时忽略或规则似乎不起作用,但规则会在控制台中导致“对象没有方法”错误,并且由于某种原因忽略不会影响它。
    • Jake 我忘记包含您的 ID 以忽略大小写,已更正,请立即尝试并告诉我,同时让我解决“对象没有方法”错误。
    【解决方案2】:

    使用 .rules("remove") 删除 jquery 验证。

    $(function(){
    jQuery('input[name=group]').change(function() {
      var selected = jQuery(this).val();console.log(selected);
      if(selected == 'ck2'){
        jQuery('#phonedisp').show();
        jQuery('#emaildisp').hide();
        jQuery("#emailv").rules("remove"); //remove the other field validation
        jQuery("#phonev").validate({
        expression: "if (VAL) return true; else return false;",
        message: "Please enter your phone number"
        });  
      } else {
       jQuery('#phonedisp').hide();
       jQuery('#emaildisp').show();
       jQuery("#phonev").rules("remove"); //remove the other field validation
       jQuery("#emailv").validate({
       expression: "if (VAL) return true; else return false;",
       message: "Please enter your email"
       });  
      }
     }); 
    jQuery('input[name=group]').triggerHandler("change");
    });
    

    我看到您有重复的代码,只需将其删除并在页面首次加载时使用jQuery('input[name=group]').triggerHandler("change"); 触发它

    【讨论】:

    • 非常感谢您清理代码!在电话和电子邮件之间切换效果很好。但是,只有一个问题,验证删除似乎不起作用,我收到一条错误消息,提示“对象没有方法'规则'”。一旦我删除了规则行,它就会完美地工作,除非我在单选按钮之间切换它会让我填写两个字段。再次感谢!
    • @Jake:看来您使用的库不是 jquery 验证插件。这个想法是删除其他字段验证。检查您正在使用的库的文档以查找相关方法。希望你能找到它。
    • 这确实是问题所在,我使用的是 GeekTantra 的插件,结果效率不高。所以切换到jquery验证插件。再次感谢您的帮助,我会更新帖子,这样如果其他人遇到同样的情况,他们可以看到。
    猜你喜欢
    • 2018-02-27
    • 1970-01-01
    • 2016-09-04
    • 2011-08-21
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多