optgroup с опциями на ul с li

#jquery #select #html-lists #dropdown

#jquery #выберите #html-списки #выпадающий список

Вопрос:

Я создаю пользовательский выпадающий список выбора. Я пытаюсь преобразовать параметры в элементы li, которые работают до сих пор. Для преобразования я просто использую $(selector).each(..). Но я хочу, если они существуют внутри элемента select, преобразовать opgroups в элементы ul и поместить их параметры внутри них как элементы li.

Итак, чтобы затормозить его
, если у меня есть:
<выберите>
<опция>
<опция>
<опция>
</select>
или
<выберите>
<optgroup>

<опция>
<опция>
</optgroup>
</select>

Должно стать:
<li>
<li>
<li>
или
<ul>
<li>
<li>
<li>
</ul>

Как я могу добиться этого в jQuery? Например, я хочу, чтобы optgroups были ul, только если они находятся в выборе. И параметры в правом ul на основе их optgroup. Моя проблема сейчас в том, что я получаю все опции в каждой optgroup (поэтому одни и те же опции в каждой optgroup, что НЕ то, что я хочу).

* Optgroup должна стать ul, к которой должны быть добавлены соответствующие опции в качестве элементов li.

Ответ №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> 

Комментарии:

1. Это сработало отлично, однако, если бы я добавил несколько вариантов выбора, как я могу убедиться, что правильные параметры добавлены к правильному выбору? Прямо сейчас все те же параметры добавляются ко всем элементам выбора.

2. Привет, можете ли вы задать еще один вопрос по этому поводу .. дайте мне знать тогда 🙂 поможет вам там

3. Ну, это связано с этим вопросом, поэтому я боюсь, что если я открою новый вопрос, он будет удален.

4. я вижу, так что вы можете сделать jsfiddle с вашей текущей проблемой?

5. Конечно, можно! Вот ссылка: jsfiddle.net/32eu617m/39

Ответ №2:

С each помощью метода jQuery вы могли бы сделать что-то вроде этого:

   <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>

 

Комментарии:

1. Нет, конечно, я уже это сделал, и это работает, но то, что я ищу, — это способ заставить его работать и с optgroups. Поэтому, если я добавлю optgroup, optgroup будет функционировать как элемент ul. Но все же спасибо за ваш быстрый ответ!

2. Затем вы можете проверить наличие элемента nodename в цикле. if ($(this)[0].nodeName == ‘OPTGROUP’) { // сделай что-нибудь }

3. Но в этом случае вам нужно будет изменить селектор на $(‘select *’).каждый (