【问题标题】:optgroup with options to ul with lioptgroup 与 ul 和 li 的选项
【发布时间】:2021-03-29 19:48:38
【问题描述】:

我正在制作自定义选择下拉菜单。我正在尝试将选项转换为到目前为止有效的 li 元素。对于转换,我只需使用 $(selector).each(..)。但是我想,如果它们存在于 select 元素中,则将 opgroups 转换为 ul 元素并将它们的选项作为 li 元素放置在其中。

所以要停下来
如果我有:



应该变成:










    如何在 jQuery 中实现这一点? 就像我希望只有当它们在选择中时才将 optgroups 作为 ul 。正确的 ul 中的选项基于他们的 optgroup。我现在的问题是我得到了每个 optgroup 中的所有选项(所以每个 optgroup 中的相同选项不是我想要的)。

    *optgroup 应该成为 ul,相应的选项必须作为 li 元素附加到该 ul。

  • 【问题讨论】:

      标签: jquery select html-lists dropdown


      【解决方案1】:

      您可以使用以下方法检查每个循环内引用的当前元素是否为OPTGROUP prop("tagName") 如果是,则使用 each loop 循环遍历其中的 option 标签并附加生成的 html 。

      演示代码

      var html = "";
      $("select > * ").each(function() {
        //check tag name
        if ($(this).prop("tagName") == "OPTGROUP") {
          html += "<ul>" //create ul append it
          //loop throuh options
          $(this).find("option").each(function() {
            html += "<li>" + $(this).text() + "</li>" //append li
          })
          html += "</ul>" //close ul tag
        } else {
          html += "<li>" + $(this).text() + "</li>" //if option is there
        }
      })
      $("#result").html(html)
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      <select>
        <option> S </option>
        <optgroup label="First">
          <option> A </option>
          <option> B </option>
        </optgroup>
        <optgroup label="Second">
          <option> E </option>
          <option> F </option>
        </optgroup>
        <option> R </option>
      
      </select>
      
      
      <ul id="result"></ul>

      【讨论】:

      • 效果很好,但是如果我要添加多个选择,如何确保将正确的选项附加到正确的选择?现在所有相同的选项都附加到所有选择元素。
      • 嗨,你能不能再问一个问题......然后让我知道:) 会帮助你
      • 嗯,它与这个问题有关,所以我担心如果我打开一个新问题,它会被删除。
      • 我明白了,你能用 jsfiddle 解决你当前的问题吗?
      • 当然可以!这是链接:jsfiddle.net/32eu617m/39
      【解决方案2】:

      使用 jQuery each 方法,您可以执行以下操作:

        <select>
          <option value="">Test 1</option>
          <option value="">Test 2</option>
          <option value="">Test 3</option>
        </select>
      
        <ul></ul>
      
        <script>
      
          $(document).ready(function() {
            
      
            $('select option').each(function() {
      
              var li = '<li>' + $(this).text() + '</li>';
              $('ul').append(li);
      
            });
      
      
          })
      
        </script>
      
      

      【讨论】:

      • 不,当然我已经这样做了,而且它可以工作,但我正在寻找一种让它与 optgroups 一起工作的方法。因此,如果我添加一个 optgroup,则该 optgroup 将用作 ul 元素。不过感谢您的快速回答!
      • 然后您可以检查循环中的元素节点名。 if ($(this)[0].nodeName == 'OPTGROUP') { // 做点什么 }
      • 但在这种情况下,您需要将选择器更改为 $('select *').each(
      猜你喜欢
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      相关资源
      最近更新 更多