【问题标题】:Get all possible values of a select field获取选择字段的所有可能值
【发布时间】:2021-12-10 03:33:23
【问题描述】:

我有一个不同值的选择字段:

  • 非洲
  • 欧洲
  • 美国
  • 亚洲
  • 大洋洲

选择一个值时,我想将CSS类添加到特定的DIV,CSS类的名称为选择的值。很简单:

  $(document).on("change",  "[data-name='continent'] select", function () {
    var continent = $('[data-name="continent"] select').val();
    $("#mydiv").addClass(continent);
  });

这工作正常,但有一个问题:如果我更改选择字段值,以前的类将不会被删除。我做不到:

$("#mydiv").removeClass().addClass(continent); 

因为#mydiv 已经有其他重要的类。 我可以这样做:

$("#mydiv").removeClass('africa').removeClass('europe').removeClass('america').removeClass('asia').removeClass('oceania').addClass(continent);

但实际上我有不止 5 个选项,而且它们将来可能会改变;我宁愿保持灵活。 最重要的是,我想学习 javascript。 有什么方法可以删除作为选择字段值的所有类?

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    试试这个:

    $('#continent').on('change', (e) => {
      let $myDiv = $('#myDiv'),
          $continent = $(e.target),
          possibleValues = $continent.find('option').toArray().map(item => item.value).join(' ');
      
      $myDiv.removeClass(possibleValues).addClass($continent.val());
    });
    

    解释:

    1. 从选择中收集所有可能的值:

      $continent.find('option').toArray().map(item => item.value)
      
    2. 将它们以空格分隔的列表连接成一个字符串:

      .join(' ');
      
    3. 从目标元素中删除该列表中的所有类

      $myDiv.removeClass(possibleValues)
      
    4. 在其后添加选定的类。

    演示:

    $('#continent').on('change', (e) => {
      let $myDiv = $('#myDiv'),
          $continent = $(e.target),
          possibleValues = $continent.find('option').toArray().map(item => item.value).join(' ');
      
      $myDiv.removeClass(possibleValues).addClass($continent.val());
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <select id="continent">
      <option value="a">A</option>
      <option value="b">B</option>
      <option value="c">C</option>
      <option value="d">D</option>
      <option value="e">E</option>
    </select>
    
    <div id="myDiv" class="other-class keep-me">my div</div>

    【讨论】:

    • 感谢您的解决方案,更感谢您的解释。我就是这样学习的!
    • 您好,我刚刚成功实施了您的解决方案,再次感谢您。现在我想让它也可以打开。由于我不知道如何使函数在“更改时”和“打开时”都起作用,因此我复制了您的代码并对其进行了调整。我尝试了不同的东西,但没有运气。我相信这是我不知道如何使用的 e.target 。这是我的最后一次尝试:let $myDiv = $('#myDiv'), $continent = $('#continent').target, possibleValues = $continent.find('option').toArray().map(item =&gt; item.value).join(' '); $myDiv.removeClass(possibleValues).addClass($continent.val());
    • @Kev 您所说的“打开时”,页面加载时是什么意思?如果是,您可以尝试使用document.ready,例如:$(document).ready(() =&gt; { $('#continent').change(); });
    【解决方案2】:

    要获取要删除的类的列表,您可以使用以下内容:

    [...testEl.querySelectorAll('option')].map(x => x.value).join(' ');
    

    这是普通的 JavaScript...如果在 jQuery 中完成,它看起来像这样:

    $('#my-select > option').map((i,el)=> el.value).toArray().join(' ');
    

    这将拉出一个选项列表并为您提供一个以空格分隔的字符串。然后你可以使用这个列表来做你的.removeClass()

    但是我想知道类是否是最好的选择。在下面的 sn-p 中,有一个使用数据属性而不是类的示例,以及如何在 CSS 选择器中使用该数据属性(这也适用于 jQueryquerySelector)。也许可以考虑...

    const testEl = document.querySelector('#test');
    
    const allOptions = $('#test > option').map((i,el)=> el.value).toArray().join(' ');
    console.log(allOptions);
    
    const testChange = e => {
      const el = e.target;
      el.dataset.chosen = el.value;
    };
    testEl.addEventListener('change', testChange);
    testChange({ target: testEl });
    #test[data-chosen="africa"] {
      color: red;
    }
    
    #test[data-chosen="america"] {
      color: blue;
    }
    
    #test {
      color: orange;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <select name='test' id='test' value='europe'>
      <option value='africa'>africa</option>
      <option value='europe'>europe</option>
      <option value='america'>america</option>
      <option value='asia'>asia</option>
      <option value='oceania'>oceania</option>
    </select>

    【讨论】:

    • 非常感谢!事实上,我考虑的是一个属性而不是一个类,但这超出了我的技能范围。我会尝试标准的课程方式,然后我会尝试第二种方式来学习新的东西。
    【解决方案3】:

    您必须创建一个字符串,其中包含您要添加/删除的所有类,以空格分隔:

    $("#mydiv").removeClass("africa europe america asia oceania");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 2023-01-13
      • 2018-02-20
      • 2012-08-10
      • 1970-01-01
      • 2021-09-12
      相关资源
      最近更新 更多