css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
14 Апр
Хорошее древовидное меню пригодится в любом хозяйстве и поэтому сегодня я предлагаю познакомиться с прекрасным плагином для библиотеки jQuery – jQuery Treeview, который позволяет превратить ненумерованный список в древовидное меню.
Для начала, как всегда продемонстрирую пример работы…
Вы можете скачать исходный код примера и воспроизвести этот пример на своем сайте.
* – в архиве не содержатся js-файлы, их можно скачать отдельно в разделе Download.
Нам потребуется подключить в раздел HEAD страницы несколько файлов: само собой разумеется библиотеку jQuery jquery-1.2.3.js, файл плагина jquery.treeview.js и если подразумевается работа с cookies – файл jquery.cookie.js
<script type="text/javascript" src="js/jquery-1.2.3.js"></script> <script type="text/javascript" src="js/jquery.cookie.js"></script> <script type="text/javascript" src="js/jquery.treeview.js"></script>
Для того, чтобы сделать из ненумерованного списка древовидное меню в самом простом случае, с настройками по умолчанию, достаточно будет написать только это:
<script type="text/javascript">
$(document).ready(function(){
$("#selector").treeview();
});
</script>
где #selector – это идентификатор ненумерованного списка, ну а $(document).ready(function(){}); упоминается в каждой статье про jQuery – отслеживается момент готовности объектной модели документа (DOM).
В прилагаемых таблицах стилей содержатся несколько вариантов оформления, в архив включены и соответствующие изображения. Все это можно менять на свой вкус и цвет, сохраняя названия классов.
HTML-rод тоже не содержит ничего необычного. Пожалуй обращу Ваше внимание на такие моменты:
- если элементу li ненумерованного списка присвоить класс с именем closed, то при первоначальной загрузке этот элемент будет скрыт.
- элементы span с именем класса folder, находящиеся внутри li это папка, внутри которой могут находиться другие папки или пункты меню.
- элементы span с именем класса file, находящиеся внутри li это пункты меню.
Выше мы уже рассмотрели как сделать древовидное меню с настройками по умолчанию, но возможно использование и некоторых опций, которые позволят более гибко использовать этот плагин. Посмотрим на примере кода:
<script type="text/javascript">
$(document).ready(function(){
$("#navigation").treeview({
persist: "location",
collapsed: true,
unique: true
});
});
</script>
Приведу пояснения к этим, и некоторым другим опциям:
animated – принимает строку (slow, normal, fast) или число (миллисекунды), определяющие скорость анимационного
эффекта. Если опция неопределена – эффект отсутствует.
$(".selector").treeview({
animated: "fast"
});
collapsed – по умолчанию false. Позволяет скрывать все ветви дерева при загрузке страницы, если установлена в true.
$(".selector").treeview({
collapsed: true
});
unique – по умолчанию false. Если установить в true – устанавливает разрешение на открытие одновременно только одной ветки дерева на соответствующем уровне. Т.е. при открытии одной ветки – скрывает «сестринские» ветки уровня. При начальной загрузке все ветки скрыты.
$(".selector").treeview({
unique: true
});
toggle – функция, которая будет вызвана в момент переключения веток. Аргумент this ссылается на переключаемый UL элемент (точнее на набор элементов LI, принадлежащих этому UL).
$(".selector").treeview({
toggle: function() {
console.log(this + " переключено!");
}
});
control – определяет элемент который будет служить управляющим элементов древовидного меню, чтобы позволить пользователю разворачивать, сворачивать или переключать все меню одним кликом.
$(".selector").treeview({
control: "#container"
});
в примере им служит элемент с идентификатором container.
persist – принимает строку. Варианты: «location» или «cookie». Если установлено в «location» – выбирает активный элемент древовидного меню в location.href.
$(".selector").treeview({
persist: "location"
});
Если установлено в «cookie» – сохраняет и восстанавливает состояние выбранного элемента древовидного меню в cookie с именем treeview.
$(".selector").treeview({
persist: "cookie"
});
cookieId – по умолчанию «treeview». Определяет имя cookie, используемое в опции persist.
$(".selector").treeview({
persist: "cookie",
cookieId: "navigationtree"
});
Я рассказал далеко не все и привел не все примеры. Для того, кто хочет узнать про этот плагин побольше приведу ссылки. Материалы естественно на английском языке.
http://jquery.bassistance.de/treeview/demo/ – демонстрационная страница плагина.
http://docs.jquery.com/Plugins/Treeview – страница плагина на сайте jQuery.
Отзывов (35) на «jQuery Treeview – древовидное меню»
Вот к такому куда интересней пример формирования дерева, да и есть интересное AJAX дерево SimpleTree основанное на списках… Но все равно примного благодарствую за ваши труды!
Собственно это дерево тоже именно на списках основано….
Клевое дерево, но не подходит для мощьной разветвленной структуры: при количестве элементов примерно в 2000 чтоб сформировать дерево мой ноут (Pentium M 2.13 512DDR2) думает примерно 3 минуты на 100% загрузке
А можно каким-то образом експандить дерево, если я симулирую клик на элемент списка:
$(‘#item_li_id’).children(’span’).trigger(‘click’)?
При этом если элемент закрыт, то он выбирается, но дерево не разворачивается.
Если только попробовать путем эксперимента. Посмотрите домашнюю страницу плагина http://bassistance.de/jquery-plugins/jquery-plugin-treeview/ и документацию к нему на сайте jQuery http://docs.jquery.com/Plugins/Treeview
Может чем-то поможет…
Жестокая вещь jQuery
Опытным путем нашел такой рабочий вариант:
function switch_settings(code) {
var t_code = $('#folders #t_' + code).children('span');
t_code.trigger('click');
t_code
.parents("li[@class='expandable']")
.children('.hitarea').trigger('click');
return false;
}
Да, и спасибо за отличный блог… статьи весьма радуют!
А как сделать чтобы при клике на тэге a выделялся элемент? Все танцы с бубном перепробовал — не помогает
Интересно, а этот плагин теперь поддерживает многострочные листья дерева (т.е. когда название пункта не тянется под скроллом с помощью overflow, а спокойно переносится на следующую строку, растягивая, соответственно, и соединительные линии веток?
Все плагины под JQuery, которые я излазил, не отличались этой возможностью. Насколько я помню, плагин jQuery Treeview тоже этого не умел.
что-бы переносится на следующую строку, растягивая, соответственно нужно ширину элементам списка задать через стили, например:
#container li{width:100px !important;}
Люди….у меня не работает помагите кто-нить(по ходу библиотеки галимо скачались), если можете киньте плз текстовик и библиотеки на майл(zezeika@mail.ru)
Можно ли переделать(или может есть другой плагин) чтобы возле элементов дерева стояли чекбоксы и при выставлении галочки в верхнем чекбоксе, выставлялись галочки на всех остальных уровнем выше?
lis: никто не мешает поставить перед текстом , ну а потом кодить =)
тьфу. *инпут тайп*. съелось.
в помощь есть такой скриптик-
// context = id элемента, внутри которого чекбоксы
function checkall(context){
$(«#»+context).find(«input[@type$='checkbox']«).each(function(){
this.checked = checked;
});
}
Попробывал в Интернет эксплолере все нормально а опере вместо дерева все го содержимое в столбик
Подскажите что не так
Смотрите включена ли поддержка JS в Опере, смотрите стилевое оформление у себя. Я смотрю в той же Опере – все в порядке.
В том то и дело на самом сайте примеру в опере смотрю нормально на этой стринице тоже
А то что сделал по инструции на странице не работает. При это м винтернет эксплорере все нормально отображается
2lis: что-то вроде этого:
(чекбоксы ессно руками пишем)
$(«#treeview»).find(«li»).each( function() {
var input = $(this).find(«input[type=checkbox]:first»);
var children = $(this).find(«ul input[type=checkbox]«);
if ( children.length > 0 ) {
input.click( function() {
children.attr(‘checked’, input.attr(‘checked’));
});
}
});
а существует ли возможность строить дерево, подружая данные из файла, желательно хмл?
Я, наверное, задам глупый вопрос, но я всё никак не могу понять, что надо сделать, чтобы дерево «махало ветками» (разворачивало/скрывато поддерево) _только_ при нажатии на «плюс/минус».
А при нажатии на элемент списка (типа «file» или «folder») – ничего бы не происходило (точнее, только вызывалась бы нужная мне функция, но это я вроде понял).
Насколько помню, каких-то опций для этого в самом плагине не предусмотрено. На всякий случай
http://docs.jquery.com/Plugins/Treeview/treeview
посмотрите повнимательнее.
Самый великолепный плагин для этого всего — jstree
Спасибо.
Нашёл ответ автора Treeview на подобный вопрос в jQuery discussion list
«Try binding your click-event first, returning false from the function
you add. Apply the treeview afterwards – in theory, the tree shouldn’t
do anything after your click function got called.»
(Тому, кто там спрашивал, это, правда, не помогло, но у меня пока в тесте сработало. ^_^)
А как сделать чтобы по умолчанию список был закрытым?
collapsed: true
Добрый день, а можно что бы мень сортировалость + drag’n'drop…
и чтобы формат вывода был таков.. всё придумал но с java проблемы
[POST]
treesort = 1-0, 2-0
и потом это всё в базку писать
$items = explode(«,»,$_GET['treesort']);
for($no=0;$no<count($items);$no++){
$tokens = explode(«-»,$items[$no]);
mysql_query(«update tbl_pages set parent_id=’».$tokens[1].»‘, position=’$no’ where id=’».$tokens[0].»‘») or die(mysql_error());
}
Таблица в Mysql
nodes
———————
ID int
title varchar(255)
position int
parentID int
Boris, Вы правда думаете, что в комментах я смогу подробно расписать как это сделать? Понимаете, вряд ли Вы сможете реализовать нужный функционал объединением возможностей каких-либо расширений к jQuery. Такие вещи пишутся специально, под поставленную задачу. Так что придется Вам осваивать JavaScript….
P.S. Постарайтесь не путать JavaScript и Java. На программерских форумах не прощают….
Всё сделал…
mycms.boris-k.net/admin/site-mapСпасибо…
А как определить в каком состоянии находится текущий узел свернутом или развернутом ?
$(«#tree»).treeview({
collapsed: true,
unique: false,
animated: «fast»,
prerendered: false,
toggle: function() {
this – текущий узел
},
});
просто спасибо.
zt50:Самый великолепный плагин для этого всего — jstree.
Полностью согласен. На site-96.ru есть документация по jstree на русском.
Здравствуйте! спасибо за статью, у меня в списке чекбоксы, как сделать так, чтобы при формировании списка папки в которых есть отмеченные чекбоксы были открыты, а остальные закрыты? при условии, что список генерится пхп и просто подписать класс «клосед» нет возможности, как это можно сделать на js?
как это можно сделать на js?
При загрузке страницы отыскивать отмеченные чекбоксы и соответственно открывать нужные секции. Конкретное решение во многом зависит от Вашей html-разметки…. Как именно можно отыскать нужные чекбоксы или открыть скрытые секции – читайте документацию по селекторам и эффектам jQuery. В ней сейчас недостатка нет.
Обсуждение закрыто. Свои вопросы Вы можете задать на форуме jQuery.