【问题标题】:Jquery Selectors based on the Value of Three Drop Down Menus基于三个下拉菜单值的 Jquery 选择器
【发布时间】:2011-11-23 02:19:26
【问题描述】:

我正在使用三个下拉菜单,每个下拉菜单都有三个选项。这三个下拉菜单共同创建了一个系统,该系统可以处于 27 种状态中的任何一种状态。对于每个下拉菜单,都有选项 1、选项 2 和全部(这是选项 1 和 2 的并集)。

根据这三个下拉菜单的状态,我想显示或隐藏不同的div。这些 div 具有这种形式的类 class="distribution-(select-1)-(select-2)-(select-3)"

我正在尝试找到一种不依赖 27 个不同条件的 DRY 编码方式。

这里是下拉菜单:

<div  style = "margin-top:1cm; font-size:125%">
    <strong>Clickout Type&nbsp;</strong>
    <select class = "clickouts" >
        <option value = "all" selected="selected">All</option>
        <option value = "clickouts" >Clickouts</option>
        <option value = "preferred" >Preferred Clickouts</option>
    </select>
    <strong>Graph Type&nbsp;</strong>
    <select class = "graph-type" >
        <option value = "all" selected="selected">All</option>
        <option value = "hist" >Histograms</option>
        <option value = "percent" >Percent</option>
    </select>
    <strong>Roll-up Type&nbsp;</strong>
    <select class = "roll-up" >
        <option value = "all" selected="selected">All</option>
        <option value = "aggregate" >Aggregate</option>
        <option value = "granular" >Granular</option>
    </select>
</div>

以下是 div 类的一些示例: distribution-hist-clickouts-aggregate, distribution-percent-clickouts-aggregate, class="distribution-hist-clickouts-granular", distribution-percent-clickouts-granular

这是前七个状态的 jquery:

$('.clickouts, .graph-type, .roll-up').change(function(){
    var graph_type = $('.graph-type').val(); 
    var roll_up = $('.roll-up').val();
    var clickouts = $('.clickouts').val(); 

    if (graph_type == 'all' & roll_up == 'all' & clickouts == 'all'){
        $('div[class*="distribution"]').css('display', 'block');
    }
    if (graph_type == 'all' & roll_up == 'all' & clickouts == 'clickouts'){
        $('div[class*="clickout"]').css('display', 'block');
        $('div[class*="preferred"]').css('display', 'none');
    }

    else if (graph_type == 'all' & roll_up == 'all' & clickouts == 'preferred'){
        $('div[class*="clickout"]').css('display', 'none');
        $('div[class*="preferred"]').css('display', 'block');
    }

    else if (graph_type == 'hist' & roll_up == 'all' & clickouts == 'all'){
        $('div[class*="hist"]').css('display', 'block');
        $('div[class*="percent"]').css('display', 'none');
    }

    else if (graph_type == 'percent' & roll_up == 'all' & clickouts == 'all'){
        $('div[class*="hist"]').css('display', 'none');
        $('div[class*="percent"]').css('display', 'block');
    }

    else if (graph_type == 'all' & roll_up == 'aggregate' & clickouts == 'all'){
        $('div[class*="aggregate"]').css('display', 'block');
        $('div[class*="granular"]').css('display', 'none');
    }

    else if (graph_type == 'all' & roll_up == 'granular' & clickouts == 'all'){
        $('div[class*="aggregate"]').css('display', 'none');
        $('div[class*="granular"]').css('display', 'block');
    }
});

【问题讨论】:

标签: javascript jquery html jquery-selectors css-selectors


【解决方案1】:

如果您要将复杂类 class="distribution-(select-1)-(select-2)-(select-3) 更改为一组类 class="distribution (select-1) (select-2) (select-3),您可以使用以下脚本:

$('.clickouts, .graph-type, .roll-up').change(function(){
    var graph_type = $('.graph-type').val(); 
    var roll_up = $('.roll-up').val();
    var clickouts = $('.clickouts').val(); 

    graph_type = (graph_type == "all" ? "" : "." + graph_type);
    roll_up = (roll_up == "all" ? "" : "." + roll_up);
    clickouts = (clickouts == "all" ? "" : "." + clickouts);

    var selector = '#container div' + graph_type + roll_up + clickouts;

    $('#container div:visible').hide();
    $(selector).show();
});

代码:http://jsfiddle.net/9R5zj/9/

【讨论】:

  • 正要提出同样的建议
  • 这将如何解释所有条件,这是任一选项的联合。
  • 哦,是的...忘了提。您有 2 个选项:设置“所有”空值并使用我使用的脚本,否则您可以更改要与“所有”值进行比较的脚本,如下所示:graph_type = (graph_type == "all" ? "" : "." + graph_type);
  • 我已经更新了示例和 jsfiddle 以适应您的初始要求,All 的“全部”值
【解决方案2】:

好的,有几件事可以帮助重构它。

您应该记住的一件简单的事情是元素可以有多个类。这意味着,您可以为 div 提供四个类,而不是具有 distribution-hist-clickouts-aggregate 类的 div,如下所示:

<div class="distribution hist clickouts aggregate"></div>

此外,不要将选择选项的value 设置为all,而是通过将选择器放入值中来使程序更容易理解:

<option value = ".aggregate, .granular" selected="selected">All</option>    
<option value = ".aggregate" >Aggregate</option>    
<option value = ".granular" >Granular</option>    

我不确定我是否完全理解所有 if 语句背后的逻辑,但你可以做一些事情来达到这个效果:

$("div.distribution").hide();
$(graph_type).show();
$(roll_up).show();
$(clickouts).show();

您可以在 this demo 上看到我的建议。

【讨论】:

    猜你喜欢
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 2012-10-27
    • 1970-01-01
    • 2016-01-10
    • 2019-11-20
    • 2013-04-20
    相关资源
    最近更新 更多