Здравствуйте Хабралюди!
Сейчас буду рассказывать об одном «дереве».
Зачем и почему нужны «деревья» – Вы знаете лучше меня.
Понадобилось для одного проекта «дерево» (tree view).
Известные реализации в порядке важности\значимости для лично меня:
Т.е., можно сказать, что я на них «засматривался».
UPD:
Во-первых хочу отметить, что очень сильно уважаю приведенные примеры.
Во-вторых, данный компонент по очень многим параметрам сильно проигрывает.
В третьих — чтобы получить хотя бы что-то схожее с jsTree, например, нужно будет много своего кода написать.
Но, тем не менее решил запилить свой компонент.
Для самых нетерпеливых: ссылка на пример в работе.
Основные features:
Основные anti-features:
Есть какая-никакая документация там же.
Частично приведу её здесь:
Что такое leaf:
Т.к. там всё, вроде бы – просто, то жду q & a в comment'ы.
Сейчас буду рассказывать об одном «дереве».
Зачем и почему нужны «деревья» – Вы знаете лучше меня.
Понадобилось для одного проекта «дерево» (tree view).
Известные реализации в порядке важности\значимости для лично меня:
- http://www.jstree.com/
- http://bassistance.de/jquery-plugins/jquery-plugin-treeview/
- http://dhtmlx.com/docs/products/dhtmlxTree/index.shtml
- http://dojotoolkit.org/documentation/tutorials/1.7/store_driven_tree/demo/demo.html
- http://demo.qooxdoo.org/devel/showcase/#tree
Т.е., можно сказать, что я на них «засматривался».
UPD:
Во-первых хочу отметить, что очень сильно уважаю приведенные примеры.
Во-вторых, данный компонент по очень многим параметрам сильно проигрывает.
В третьих — чтобы получить хотя бы что-то схожее с jsTree, например, нужно будет много своего кода написать.
Но, тем не менее решил запилить свой компонент.
Для самых нетерпеливых: ссылка на пример в работе.
Основные features:
- Всё дерево запрашивается
- Запрашивается частями
- Подгружается в указанные узлы
- Очень многое сильно настраивается
- Практически «везде» есть поведение «по умолчанию»
- Сохранение состояния через cookie
- Независимость от backend
- Think by Youself
- etc.
Основные anti-features:
- Всё дерево запрашивается
- Запрашивается частями
- Подгружается в указанные узлы
- Это «что-то новое»
- Независимость от backend
- Компоненту «без году неделя» – сыровато
- В source нет comments
- Think by Youself
- etc.
Есть какая-никакая документация там же.
Частично приведу её здесь:
$('#tree_content_div').treeControl( { // как будет выглядеть запрос верхнего уровня root : 'top' // callback, который вернет "имя" листа , name : function( obj ){ return obj.name; } // название темы в CSS , theme : 'custom' // callback, где можно вывести некоторые messages , info : function( data ){ alert(data); } // скорость анимации , animate : 1500 // лучше посмотреть доку , preloader : 2 // классы , classes : { treeLeaf : 'tree-leaf' , heading : 'heading' , control : 'control' , status : 'status' , loader : 'loader' , selected : 'selected' , preloader : 'preloader' , hover : 'hover' } // лучше посмотреть доку , control : { text : ['+', '–'], cls : 'open' } // $.tmpl() шаблон узла , template : '<li><span class = "heading">${obj.name}</span> <ul class = "tree-leaf"></ul></li>' // шаблон управляющего элемента +\- НЕ $.tmpl() , ctrlTpl : '<span class = "control"></span>' // шаблон дополнительного элемента "статуса" НЕ $.tmpl() , statusTpl : '<span class = "status"></span>' // можно bind на управление, выделение, // потерю выделения, добавление узла , handlers : { control : function( leaf ){ } , select : function( leaf ){ } , blur : function( leaf , result ){ if (something){ // Your Great Checking / Blocking code }else{ result(); } } , leafsAdd : function( leaf , controlObject ){ } } // можно bind на ... понятно , callbacks { click : function( leaf ){ } , mouseover : function( leaf ){ } , mouseout : function( leaf ){ } } // сохранять или нет состояние, зависит от наличия $.cookie // если saveState не определен -- ничего не будет храниться , saveState : { name : 'tree_control_cookie_name' , opts : { expires: 150 } } // самая сложная часть -- то, что возвращает узлы, см пример: , ws : function( val, callback ){ try{ var val = ( typeof( val ) == 'string' ) ? { 'leaf' : val , action : 'get' } : ( ( typeof( val ) == 'object' ) ? val : false ); if( val ){ $.ajax( { type: "POST" , async: true , data : val , dataType : 'text' , url: './tree.php' , success: function( data ){ if( data !== ''){ callback( data ); } } , error: function(data){ alert(data); } } ) ; } }catch(e){ alert(e); } } } );
Что такое leaf:
/* { name : 'leaf.name from JSON received through 'ws', e.g. ID' obj : { name : ' returned by x.name( leaf ) ' , children : ' array of leafs that are children of this ' , parent : 'link to parent' , obj : 'JSON that comes from ws' , elem : { li : DOM of this leaf's LI , ul : DOM of this leaf's UL (where children are) , heading : DOM of heading span , control : DOM of control span , status : DOM of status span } } } */
Т.к. там всё, вроде бы – просто, то жду q & a в comment'ы.
