#javascript #jquery #jstree
#javascript #jquery #jstree
Вопрос:
я загружаю свой jsTree через json_data всякий раз, когда пользователь нажимает [ ] рядом с папкой. Что я хочу сделать, так это применить классы css к некоторым узлам, чтобы выделить их для пользователя. Здесь речь идет не о наведении курсора мыши или текущем выбранном узле, а о нескольких узлах, которые какой-нибудь человек должен просмотреть позже. Соответствующий css-класс уже находится внутри JSON-ответа от сервера:
[
{"attr":{"id":"node_5","rel":"document","page_id":"4"},"data":"Test123","csscl":"ui-state-error","state":""},
{"attr":{"id":"node_6","rel":"folder","page_id":"6"},"data":"Services","csscl":"","state":"closed"}
]
мой узел «Test123» должен получить класс «ui-state-error» позже в дереве.
Вот мой jsTree:
$(function () {
// Settings up the tree. note to self: dont use the cookie plugin here, this will always overwrite pre-selected nodes
$("#jstree").jstree({
"plugins" : [ "themes", "json_data", "ui", "types", "hotkeys",],
"json_data" : {
"ajax" : {
"url" : "inc/tree_server.php",
"data" : function (n) {
return {
"operation" : "get_children",
"id" : n.attr ? n.attr("id").replace("node_","") : 1
};
},
success: function(n) {
for (var i in n)
{
jqid = "#" n[i].attr["id"] " a";
$(jqid).addClass(n[i].csscl);
}
}
}
},
// the UI plugin
"ui" : {
// selected onload
"initially_select" : [ "node_<?=$p->oTopic->iId;?>" ]
},
// the core plugin
"core" : {
"initially_open" : [ <?=$p->oTopic->sJstreeOpenSeq;?> ],
"animation" : 0
}
})
Это не сработает. Я думаю, что происходит то, что «success: function (n)» вызывается после загрузки дерева, но до того, как оно будет нарисовано или готово для jQuery, чтобы найти выбранный узел и применить мой класс.
Кто-нибудь знает, как это решить, или, может быть, есть лучший способ применить css-класс к $ («#node5 a») в этом случае …?
Комментарии:
1. Вы пробовали jsTree в дискуссионной группе на groups.google.com/group/jstree ?
2. Не могли бы вы, возможно, установить его в объекте «данные»? «attr» : { «class»: «csscl»} ? Посмотрите на первую демонстрацию здесь. jstree.com/documentation/json_data
Ответ №1:
Я думаю, что нашел обходной путь.
success: function(n) {
for (var i in n)
{
some_global_array_id.push(n[i].attr["id"]);
some_global_array_data.push(n[i].csscl);
}
}
И затем после загрузки и рисования вы можете вызвать функцию следующим образом:
$("#jstree").jstree({
// ... code you posted
}).bind("reopen.jstree", function (e, data) {
for (var i in some_global_array_id) {
$("#" some_global_array_id[i] " a").addClass(some_global_array_data[i]);
}
});
Ответ №2:
Это можно сделать проще. Замените функцию success этим:
success: function(n)
{
for(var i = 0; i < n.length; i )
{
n[i].data.attr['class'] = n[i].csscl;
}
return n;
}
Комментарии:
1. Синтаксис для последней версии jstree изменился. Смотрите этот документ: jstree.com/docs/json . Теперь это должно быть как:
n[i].li_attr['class']
илиn[i].a_attr['class']
.