【问题标题】:jQuery add css class depending on selectbox optionjQuery 根据选择框选项添加 css 类
【发布时间】:2012-06-26 13:09:36
【问题描述】:

我有 3 个下拉列表,我想根据下拉列表的值将类添加到特定 div。

<select name="item1">
    <option>Blue</option>
    <option>Green</option>
    <option>Red</option>
</select>

<select name="item2">
    <option>Blue</option>
    <option>Green</option>
    <option>Red</option>
</select>

<select name="item3">
    <option>Blue</option>
    <option>Green</option>
    <option>Red</option>
</select>

<div class="product">
    <div class="item1"></div>
    <div class="item2"></div>
    <div class="item3"></div>
</div>

我正在尝试根据下拉列表的值添加一个 CSS 类。 例如,如果选择了下拉 item1 中的选项 blue,我想在 div 中添加一个类 .blue项目1

我曾经有复选框而不是下拉菜单,我有这个代码:

$(document).ready(function($){
    $('input#red').change(function(){
        if($(this).is(":checked")) {
            $('div.item1').addClass("red");
        } else {
            $('div.item1').removeClass("red");
        }
    });
    $('input#blue').change(function(){
        if($(this).is(":checked")) {
            $('div.item1').addClass("blue");
        } else {
            $('div.item1').removeClass("blue");
        }
    });
});

我创建了这个:http://jsfiddle.net/uJcB7/14/ 应该怎么做才正确?

------------编辑-----------

我正在使用重力形式生成选择框,它们在选项名称后添加“|0”(我不知道为什么!)。

例如“green|0”而不是“green”。 “|0”隐藏在字段中,但生成的类为“green|0”。

有没有想过如何删除 css 类中的“|0”?

它们还为选择框生成名称,是否可以使用类而不使用名称元素?

查看更新后的代码:

http://jsfiddle.net/uJcB7/24/

【问题讨论】:

    标签: jquery css class element drop-down-menu


    【解决方案1】:

    要添加类的&lt;div&gt; 的类与要更改的&lt;select&gt; 元素的name 属性相同,要添加的类的名称是值的小写版本选择的选项。考虑到这一点,这是可行的:

    $(document).ready(function($){
        $('select').change(function(){
            $('.' + this.name).attr('class', this.name + ' ' + this.value.toLowerCase());
        });
    });
    

    jsFiddle DEMO

    【讨论】:

    • 又短又甜。好的!我只会警告 OP 这将对 any 选择元素起作用,因此他们可能需要以某种方式对其进行过滤,就像 Roko 建议的那样。
    • 它还会硬编码要删除的类名,因此如果选择菜单的值发生变化,OP 需要记住更新此函数
    • @jackwanders 我无法确定处理该问题的最佳方法,但现在有了。我已经编辑了代码,因此它不是添加/删除特定的类,而是简单地用所需的新类覆盖类属性 - 这将是 itemXred/blue/green.
    • 这就是我的第一个解决方案;基本上重置类。但是,如果 div 看起来像 &lt;div class="item 1 rounded-corners"&gt;,那么您将失去 rounded-corners 类。这就是为什么我决定使用 $.map 来获取所有选项值
    • @jackwanders 假设使用的 HTML 实际上看起来像问题中的 HTML,在这种特定情况下这不会是问题。但是,总的来说,您是正确的。 $.map() 将是更通用的解决方案。
    【解决方案2】:

    这是一个通用函数,它将所选选项的文本值添加到适当的 div:

    $(document).ready(function($){
    
      $('select').change(function(){
        var s = $(this);
        var name = s.attr('name');
         $('.'+name).removeClass().addClass(name+' '+s.find(':selected').text().toLowerCase());
      });
    });​
    

    演示:http://jsfiddle.net/jackwanders/xcEa9/4/

    更一般地说,您可以使用 $.map 来获取选择菜单值的列表,以便您知道在每个更改事件中要删除哪些类名:

    $('select').change(function(){
        var $this = $(this);
        var values = $.map($this.find('option'),function(opt){ return opt.value.toLowerCase(); }).join(' ');
        $('.'+this.name).removeClass(values).addClass($(this).val().toLowerCase());
    });
    

    演示:http://jsfiddle.net/jackwanders/xcEa9/5/

    【讨论】:

    • 为了访问通过this(触发事件的&lt;select&gt;元素)随时可用的属性,这是不必要的jQuery数量。
    【解决方案3】:
    $(document).ready(function() {
    
      $('#item1').change(function() {
        $('.item1').addClass($('#item1').val());
      });
    
      $('#item2').change(function() {
        $('.item2').addClass($('#item2').val());
      });
    
      $('#item3').change(function() {
        $('.item3').addClass($('#item3').val());
      });
    
    });
    

    如果您愿意,您还可以将各个片段保留在 for 循环中。

    【讨论】:

      【解决方案4】:
      $(function() {
        $('select').bind('change', function() {
          var $this = $(this);
          $this.find('option:not(:selected)').each(function(index, option) {
            $this.removeClass($(option).text());
          });
          $this.addClass($this.find('option:selected').text());
        });        
      });
      

      Updated JSFiddle

      【讨论】:

        【解决方案5】:

        这会清除类中先前设置的颜色值(如果有)并设置新的。

        $(document).ready(function($){
            $('select').change(function(){
                name = $(this).attr('name');
                curClass = $('div.'+name).attr('class');
                $('div.'+name).removeClass(curClass).addClass(name + ' ' +$(this).val());
            });
        });
        

        Fiddle Here

        【讨论】:

          【解决方案6】:

          这个适用于您的所有select 元素。

          jsFiddle demo

          $('select[name^=item]').change(function(){
              var val = $(this).val();
              $('div.'+$(this).attr('name')).removeClass('red blue green').addClass(val);
          });
          

          select[name^=item] 搜索名称以item 开头的选择元素

          【讨论】:

          • 由于您没有删除其他类,因此如果您选择 green 然后将值切换回 redblue 将不起作用,因为 .green CSS 声明优先于其他。此外,与 jackwanders 的回答一样,jQuery 比所需的要多得多。
          猜你喜欢
          • 2020-08-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-01
          • 1970-01-01
          • 2021-03-27
          • 2016-08-25
          相关资源
          最近更新 更多