【问题标题】:jQuery: Conditional show an element based on drop down box selectionjQuery:有条件地显示基于下拉框选择的元素
【发布时间】:2012-04-29 08:09:08
【问题描述】:

我有两个相关的下拉列表,其中第二个下拉列表中的内容取决于第一个下拉列表中的选择。例如,在下面的 HTML 代码中,您将首先选择应用程序方法。如果您选择空中作为应用方法,那么您将回答进一步的问题,例如空中尺寸距离。否则,需要回答地喷式。

因此,一旦加载网页,两个二级下拉列表(空中尺寸距离和地面喷雾类型。)将被隐藏。只有在第一个(应用方法)中做出相关选择时才会出现。

我能够在 jQuery 中实现此功能(在 jQuery 代码下方)。但是我的方法很愚蠢。我的问题是:

  1. 有没有一种方法可以选择整行,而不使用对其序列进行计数 (nth-child())?我可以根据选择元素 ID 选择整行吗?例如,我可以先选择 $('#id_A'),然后将我的选择扩展到整行吗?

  2. 是否有更好的方法(循环?)来实现此隐藏或显示功能,而不是比较所有可能的选择(($(this).val() == "X"))?

谢谢!

这里是 HTML 代码,表单由 Django 生成:

<div class="articles">
    <form method="GET" action=_output.html>
        <table align="center">
<tr><th><label for="id_application_method">Application method:</label></th><td><select  name="application_method" id="id_application_method">
<option value="">Pick first</option>
<option value="A">Aerial</option>
<option value="B">Ground</option>
</select></td></tr>

<tr><th><label for="id_A">Aerial Size Dist:</label></th><td><select name="aerial_size_dist" id="id_A">
<option value="A1" selected="selected">A1</option>
<option value="A2">A2</option>
</select></td></tr>

<tr><th><label for="id_B">Ground spray type:</label></th><td><select name="ground_spray_type" id="id_B">
<option value="B1" selected="selected">B1</option>
<option value="B2">B2</option>
</select></td></tr>
</table>                  
</form>
</div>

这里是 jQuery 代码:

<script type="text/javascript" src=" https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js"></script> 

<script>$(function() {
    $("tr:nth-child(2)").hide();
    $("tr:nth-child(3)").hide();

    $('#id_application_method').change(function() {
    ($(this).val() == "A") ? 
    $("tr:nth-child(2)").show() : $("tr:nth-child(2)").hide();

    ($(this).val() == "B") ? 
    $("tr:nth-child(3)").show() : $("tr:nth-child(3)").hide();
    });});</script>

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    我认为 iKnowKungFoo 的回答非常直截了当(得到了我的投票)。我注意到你说你的表单是由 Django 生成的。如果您无法直接修改生成的 HTML 标记,这里是您的问题的另一种解决方案。

    $(document).ready(function() {
        var $aerialTr = $('#id_A').closest('tr').hide();
        var $groundSprayTr = $('#id_B').closest('tr').hide();
    
        $('#id_application_method').change(function() {
            var selectedValue = $(this).val();
    
            if(selectedValue  === 'A') {
                $aerialTr.show();
                $groundSprayTr.hide();
            } else if (selectedValue === 'B') {
                $aerialTr.hide();
                $groundSprayTr.show();
            } else {
                $aerialTr.hide();
                $groundSprayTr.hide();
            }
        });
    });
    

    这是一个要测试的 jsFiddle:http://jsfiddle.net/willslab/n54cE/2/

    它应该适用于您现有的标记。它根据选择框的当前 ID 选择 tr。如果更改这些 ID,则需要相应地修改选择器。

    希望对你有帮助!

    编辑:这是受 iKnowKungFoo 启发的另一种“混合”方法。他的解决方案非常优雅,所以我将它与我自己的结合起来。这无需更改 HTML 或 CSS 即可工作。

    $(document).ready(function() {
        $('#id_A').closest('tr').addClass('method_options').hide();
        $('#id_B').closest('tr').addClass('method_options').hide();
    
        $('#id_application_method').change(function() {
            $('tr.method_options').hide();
            $('#id_' + $(this).val()).closest('tr').show();
        });
    });
    

    jsFiddle 链接:http://jsfiddle.net/willslab/6ASJu/3/

    【讨论】:

    • 感谢您的出色解决方案!
    • 您只能接受一个答案。有时会有不止一种好的反应。只需接受您认为对您的问题最有帮助的答案,并对其他有帮助的答案投赞成票。这将表示赞赏并向其他人表明它也很有帮助。不客气。 :-)
    【解决方案2】:

    您的问题描述了正确的想法。您只需构建 HTML 即可利用它们。

    JSFiddle 发布在这里:http://jsfiddle.net/iknowkungfoo/TKamw/

    HTML - 我为每个 TR 添加了一个 ID 和 CLASS 以匹配您的主 SELECT 中的值:

    <div class="articles">
        <form method="get" action="_output.html">
            <table align="center">
                <tr>
                  <th><label for="id_application_method">Application method:</label></th>
                  <td><select name="application_method" id="id_application_method">
                    <option value="">Pick first</option>
                    <option value="A">Aerial</option>
                    <option value="B">Ground</option>
                  </select></td>
                </tr>
                <tr id="tr_A" class="method_options">
                  <th><label for="id_A">Aerial Size Dist:</label></th>
                  <td><select name="aerial_size_dist" id="id_A">
                    <option value="A1" selected="selected">A1</option>
                    <option value="A2">A2</option>
                  </select></td>
                </tr>
                <tr id="tr_B" class="method_options">
                  <th><label for="id_B">Ground spray type:</label></th>
                  <td><select name="ground_spray_type" id="id_B">
                    <option value="B1" selected="selected">B1</option>
                    <option value="B2">B2</option>
                  </select></td>
                </tr>
            </table>
        </form>
    </div>

    CSS - 默认隐藏这些 TR:
    tr.method_options { display: none; }​

    JavaScript/jQuery - 当主 SELECT 更改时,隐藏所有带有“method_options”类的 TR。然后,找到 ID 与主 SELECT 中所选选项的值匹配的 TR 并显示。如果没有匹配,则不显示任何内容。

    $(document).ready(function(){
    
        $('#id_application_method').on('change', function() {         
    
            $('tr.method_options').hide();
            $('#tr_' + $(this).val() ).show();
    
        });
    
    });

    【讨论】:

    • 非常感谢您的解决方案!
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    相关资源
    最近更新 更多