Расширяемый выпадающий список с несколькими вариантами выбора

#javascript #jquery #html #jquery-plugins

#javascript #jquery #HTML #jquery-плагины

Вопрос:

Как я могу получить расширяемый выпадающий список с несколькими вариантами выбора [в виде дерева]?

Например, из приведенного ниже снимка, если у меня есть вложенный список для животных [Кошка, корова и т.д.], Есть ли какой-либо плагин как таковой, который показывал бы знак , и при нажатии он показывал бы вложенный список в том же выпадающем списке, как древовидное представление?

введите описание изображения здесь

Есть какие-нибудь советы?

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

1. Я сомневаюсь, что плагин для этого существует, его не должно быть слишком сложно реализовать самостоятельно

2. Я согласен. У jQueryUI это есть. У YUI это тоже есть.

Ответ №1:

Я знаю, что вы не можете использовать только тег select. В вашем случае вам необходимо создать настраиваемое поле выбора.

  • Это можно сделать, используя комбинацию html-тегов, точно так же, как плагин treeview из библиотеки JavaScript, такой как jQuery UI. Но вы прокомментировали @Edgar, что для этого нет функции множественного выбора.
  • Также решением может быть внедрение плагинов flash или java.

Я предполагаю, что мое решение examples не дало вам именно то, что вы хотели. Я просто приведу простой пример, который может помочь ответить на ваш вопрос. Это делается для создания настраиваемого поля выбора.

Настраиваемое поле выбора

Как создать настраиваемое поле выбора:

  1. Создайте div, который будет контейнером списка.

    <div id="treeSelect">

  2. Добавьте стиль в div, который будет вести себя как поле выбора.

    #treeSelect{height: 100px;width: 150px;border: 1px solid #000;overflow: auto;}

  3. Добавьте содержимое основного списка вместе с подсписком в div. Включите все возможные стили, которые можно использовать для форматирования содержимого, чтобы оно больше походило на древовидный список.

     <span class="mainList">All</span>
    <br />
    <span class="expand" onClick="expand('animals', this);">[ ]</span><span class="mainList">Animals</span>
    <br />  
    <ul id="animals" class="subList">
        <li><input type="checkbox" name="animals" value="Cat">Cat</li>
        <li><input type="checkbox" name="animals" value="Cow">Cow</li>
        <li><input type="checkbox" name="animals" value="Cat">Dog</li>
    </ul>
      
  4. Добавьте скрипт, который будет обрабатывать способ просмотра подсписка.

    функция расширения (список, просмотр){

     var listElement = document.getElementById(list);
    var defaultView = '[ ]';
    
    if(view.innerHTML == defaultView){
        listElement.style.display = "block";
        view.innerHTML = '[-]'; 
    } else {
        listElement.style.display = "none";
        view.innerHTML = '[ ]';
    }
      

    }

Я не могу поместить весь код, поэтому, пожалуйста, смотрите полный код в jsfiddle.

Я знаю, что это не совсем то, что вы хотели, но я думаю, это близко к тому, что вам нужно. Вы можете изменить стиль в зависимости от вашего вкуса и потребностей. Я надеюсь, что это может помочь и дать вам представление о том, как решить ваш вопрос.

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

1. Это похоже на то, что я ищу! Но с одной проблемой, из-за которой я не могу выбрать родительский элемент. Я думаю, что плагин JS Tree — это правильный путь …. но мне не нравятся флажки, я бы предпочел, чтобы они были как список с несколькими вариантами выбора!

2. С некоторыми изменениями и дополнительными CSS и JS вы можете получить желаемый внешний вид. Я не сделал его похожим на то, что вы хотели, потому что там много чего нужно сделать. С родительским вы также можете добавить к нему флажок. Я знаю, вы спросите о флажке, но у меня нет времени, чтобы сделать его похожим на множественный выбор. Вы можете настроить это, скрыв флажок, затем добавить onClick событие li , которое будет проверяться, и снять с него флажок. Вы также меняете li фон, выбран он или нет. Опять же, предстоит еще много чего сделать, но это хорошее начало. Я надеюсь, что вы справитесь с остальным.

Ответ №2:

Вы могли бы использовать плагин treeview или плагин jsTree

Надеюсь, это поможет. Приветствия

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

1. Но то, что я ищу, — это просто выпадающий список с несколькими вариантами ВЫБОРА. В идеале, я мог бы иметь дочерний выпадающий список и показывать соответствующий вложенный список, но хотел избежать этого, предоставляя возможность выбора в виде дерева!

2. Вы могли бы создавать / удалять некоторые скрытые элементы, когда пользователь нажимает на узел в этих плагинах. Я не знаю ни одного встроенного элемента управления, который был бы точно множественным выбором с требуемыми вами функциями.

Ответ №3:

Вы можете использовать <optgroup> для каждой основной категории, дочерние элементы которой скрыты по умолчанию, и при нажатии на <optgroup> ярлык он может просто отображать дочерние элементы <option> .

Что-то вроде следующего:

В вашем CSS:

 #categories optgroup option { display: none; }
  

В вашем HTML:

 <select name="categories" id="categories">
    <optgroup label="  Animals">
        <option value="bird">Bird</option>
        <option value="dog">Dog</option>
        <option value="cat">Cat</option>
    </optgroup>
</select>
  

В вашем JavaScript (с использованием jQuery):

 $('#categories > optgroup').click(function(){
    $(this).children().toggle();
});
  

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

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

2. @HonorGod Ах, кажется, прошло слишком много времени с тех пор, как я использовал optgroups, они просто на самом деле недоступны через CSS, так что, вероятно, тогда это не сработает. Вам лучше использовать что-то вроде плагина treeview или упомянутого плагина jsTree и просто стилизовать это дерево, чтобы оно выглядело как множественный выбор, но просто привязать действия для изменения значений формы при нажатии.