#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 *’).каждый (