【问题标题】:Show <select> <options> based on radio button click根据单选按钮单击显示 <select> <options>
【发布时间】:2014-05-05 03:41:37
【问题描述】:

拳头,让我说我最近才开始使用 js/jquery(比如 2 周前),我一直在努力让以下所有技巧一起玩得很好——非常感谢任何帮助。

我有一个表格,用户可以在里面为一个班级注册多个人;在每个注册者的“块”内,存在两个单选按钮。选择一个应该显示一组类选项,选择另一个应该显示第二组选项:

HTML

<label for="name" class="label_heading">Registrant Name (first and last)</label>
<input type="text" id="name_1" value="name_1">
<br>
<p class="label_heading">Training Level:</p>
<label for="certification">
    <input type="radio" name="ClassLevel" value="certification" id="select-certification" class="select-certification">Certification

    <select class="copy hidden" name="cert" id="cert1">
        <option value="">Select a Certification Session</option>
        <option value="session1cert">Fort Dodge, IA May 5-9, 2014</option>
        <option value="session2cert">North Platte, NE Sept 22-26, 2014</option>
        <option value="session3cert">Omaha, NE Oct 13-17, 2014</option>
        <option value="session4cert">Waterloo, IA Oct 27-31, 2014</option>
        <option value="session5cert">Grand Island, NE Nov 17-21, 2014</option>
    </select>
</label>
<!--end label for certification-->
<label for="recertification">
    <input type="radio" name="ClassLevel" value="recertification" id="select-recertification" class="select-recertification">Recertification

    <select class="copy hidden" name="recert" id="recert1">
        <option value="">Select a Recertification Session</option>
        <option value="session1recert">Fort Dodge, IA May 8, 2014</option>
        <option value="session2recert">North Platte, NE Sept 25, 2014</option>
        <option value="session3recert">Omaha, NE Oct 16, 2014</option>
        <option value="session4recert">Waterloo, IA Oct 30, 2014</option>
        <option value="session5recert">Grand Island, NE Nov 20, 2014</option>
    </select>
</label>

因此,值为“certification”的单选按钮需要显示名称为“cert”的选择,选择“recertification”应该会显示选择“recert”。因为我在页面上多次重复此用户注册块,并且每个都需要以相同的方式运行,所以我选择在我的 jQuery 中使用类和 input["name:"] 作为选择器,如下所示:

$(document).ready(function () {
    $(".addReg").click(function (e) {
        $(".tbr_fieldset:hidden").slice($(".tbr_fieldset:hidden").siblings(":first").index(), 1).slideDown();
        e.preventDefault();
    });
});

$(document).ready(function () {
    $("input[name='ClassLevel']").change(function (e) {
        $(this).next(":first").toggle();
        e.preventDefault();
    });
});

几乎有效。如果您在此http://jsfiddle.net/shark_goatshark/Aktwu/1/ 中查看它,您会看到单击 + 按钮时我的“注册人”框会增加,而单选按钮确实会显示正确/对应的下拉列表。问题是一旦点击它们就不会重新隐藏。如果我点击“认证”并使其下拉菜单出现,然后改变主意并点击“重新认证”,重新认证下拉菜单会出现,但认证不会消失。

我知道必须有一个更优雅的解决方案,但我不知所措。感谢所有输入!

【问题讨论】:

    标签: jquery forms radio-button show-hide


    【解决方案1】:

    Javascript:

    $(document).ready(function() {
        $(".hidden").hide();
        $("input[type=radio][name=ClassLevel]").change(function() {
            var parent_id = $(this).closest("fieldset").attr("id");
            var child = $(this).val();
    
            $("#"+parent_id+" .hidden:visible").toggle();
            $("#"+parent_id+" ."+child).toggle();
        });
    });
    

    我使用的 html (删除了每个选择的 id 并添加了另一个与单选按钮值相同的类(即,对于认证单选,与之关联的选择的类将是认证(隐藏后添加))

    另外,我看到您将在同一页面上有多个对,所以我使用了字段集的 id(每个字段集必须有一个唯一的 id 才能正常工作)

    <fieldset id="tbr__15">
    <legend>Registrant Information</legend>
    <!--<button id="addReg" class="addReg" value="2">+</button>-->
    <div id="fieldcontwrapper">
        <!-- Wrapper for Group -->
        <div id="fieldcont">
            <!-- Group your field -->
            <div class="required">
                <label for="name" class="label_heading">Registrant Name (first and last)</label>
                <input type="text" id="name_1" value="name_1">
                <br>
                <p class="label_heading">Training Level:</p>
                <label for="certification">
                    <input type="radio" name="ClassLevel" value="certification" id="select-certification" class="select-certification">Certification
                    <!-- <label id="cert-available-classes" class="hidden" for="cert">Certification Classes Available</label>    -->
                    <select class="copy hidden certification" name="cert">
                        <option value="">Select a Certification Session</option>
                        <option value="session1cert">Fort Dodge, IA May 5-9, 2014</option>
                        <option value="session2cert">North Platte, NE Sept 22-26, 2014</option>
                        <option value="session3cert">Omaha, NE Oct 13-17, 2014</option>
                        <option value="session4cert">Waterloo, IA Oct 27-31, 2014</option>
                        <option value="session5cert">Grand Island, NE Nov 17-21, 2014</option>
                    </select>
                </label>
                <!--end label for certification-->
                <label for="recertification">
                    <input type="radio" name="ClassLevel" value="recertification" id="select-recertification" class="select-recertification">Recertification
                    <!-- <label id="recert-available-classes" class="hidden" for="recert">Recertification Classes Available</label>-->
                    <select class="copy hidden recertification" name="recert">
                        <option value="">Select a Recertification Session</option>
                        <option value="session1recert">Fort Dodge, IA May 8, 2014</option>
                        <option value="session2recert">North Platte, NE Sept 25, 2014</option>
                        <option value="session3recert">Omaha, NE Oct 16, 2014</option>
                        <option value="session4recert">Waterloo, IA Oct 30, 2014</option>
                        <option value="session5recert">Grand Island, NE Nov 20, 2014</option>
                    </select>
                </label>
                <!--end label for recertification-->
            </div>
        </div>
        <!-- #fieldcont -->
    </div>
    <!-- #fieldcontwrapper -->
    <button id="addReg" class="addReg">+</button>
    </fieldset>
    <!--fieldset#tbr__16-->
    <fieldset id="tbr__16" class="tbr_fieldset">
    <legend>Registrant Information</legend>
    <!--<button id="addReg" class="addReg" value="2">+</button>-->
    <div id="fieldcontwrapper">
        <!-- Wrapper for Group -->
        <div id="fieldcont">
            <!-- Group your field -->
            <div class="required">
                <label for="name" class="label_heading">Registrant Name (first and last)</label>
                <input type="text" id="name_1" value="name_1">
                <br>
                <p class="label_heading">Training Level:</p>
                <label for="certification">
                    <input type="radio" name="ClassLevel" value="certification" id="select-certification" class="select-certification">Certification
                    <!-- <label id="cert-available-classes" class="hidden" for="cert">Certification Classes Available</label>    -->
                    <select class="copy hidden certification" name="cert">
                        <option value="">Select a Certification Session</option>
                        <option value="session1cert">Fort Dodge, IA May 5-9, 2014</option>
                        <option value="session2cert">North Platte, NE Sept 22-26, 2014</option>
                        <option value="session3cert">Omaha, NE Oct 13-17, 2014</option>
                        <option value="session4cert">Waterloo, IA Oct 27-31, 2014</option>
                        <option value="session5cert">Grand Island, NE Nov 17-21, 2014</option>
                    </select>
                </label>
                <!--end label for certification-->
                <label for="recertification">
                    <input type="radio" name="ClassLevel" value="recertification" id="select-recertification" class="select-recertification">Recertification
                    <!-- <label id="recert-available-classes" class="hidden" for="recert">Recertification Classes Available</label>-->
                    <select class="copy hidden recertification" name="recert">
                        <option value="">Select a Recertification Session</option>
                        <option value="session1recert">Fort Dodge, IA May 8, 2014</option>
                        <option value="session2recert">North Platte, NE Sept 25, 2014</option>
                        <option value="session3recert">Omaha, NE Oct 16, 2014</option>
                        <option value="session4recert">Waterloo, IA Oct 30, 2014</option>
                        <option value="session5recert">Grand Island, NE Nov 20, 2014</option>
                    </select>
                </label>
                <!--end label for recertification-->
            </div>
        </div>
        <!-- #fieldcont -->
    </div>
    <!-- #Copperfield -->
    <button id="addReg" class="addReg">+</button>
    

    【讨论】:

    • 完美!太感谢了!我对遍历的工作原理非常模糊,但我知道必须有一种方法可以根据父元素是什么来实现它。这很好用。再次感谢您的帮助!
    • 没问题!很高兴我能帮上忙!
    • 希望你能给我指明正确的方向——还是让你更加才华横溢? :) -我不知道如何向互联网提问...当用户单击认证单选按钮并选择一个选项,但随后单击重新认证按钮并选择一个选项(在同一字段集中) , 两个选择都被记录下来。如何让它只记录最后一次选择?我正在将表单提交到一个 php 文件,所以我确信可以在那里完成一些事情,但我什至不允许表单为每个字段集发送多个选定的选项。
    • 在可能相关的注释中,当您在下一个字段集中选择单选按钮时,它会更改先前字段集中的单选按钮选择 - 选择选项保持不变,但单选按钮值不是t 提交,然后。任何方向将不胜感激!再次感谢!
    【解决方案2】:

    使用 slideToggle 而不是切换,您只需要 document.ready 在顶部一次,您的所有代码都在该文档就绪函数的最后一个括号之间

    【讨论】:

    • 修复了 document.ready 问题——但 slideToggle 并没有改变问题。两个选择仍在显示...
    【解决方案3】:

    开始之前:

    $(this).next(":first")
    

    这里的 :first 选择器是多余的。因为 $(this) 只会返回一个 jquery 元素,并且 :first 返回集合的第一个 jquery 元素,所以它不是必需的。所以我们拥有的是:

    $("input[name='ClassLevel']").change(function (e) {
        $(this).next().toggle();
        e.preventDefault();
    });
    

    如果从被选中到未选中的更改触发了更改事件,这将正常工作。不幸的是,事实并非如此。只有被选中才会触发更改事件(您几乎可以将其视为输入上的点击事件)。

    知道这一点,这意味着我们需要重置任何先前更改事件的更改,即显示您的下拉菜单。实现此目的的一种方法是在显示当前下拉列表之前简单地隐藏所有下拉列表。所以我们有:

    $("input[name='ClassLevel']").change(function (e) {
        $("input[name='ClassLevel']").next().hide();
        $(this).next().toggle();
        e.preventDefault();
    });
    

    【讨论】:

    • 谢谢!您的建议可以在一个框架集中切换每个,但是当我添加另一个注册者并从 [新框架集] 中选择一个单选按钮时,它会重置前一个单选按钮...?
    猜你喜欢
    • 1970-01-01
    • 2011-08-21
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多