Захват событий флажка Jquery Jstree

Я совершенно новичок в jQuery и jstree. Я использую jstree и заполняю данные с помощью xml. Но хотелось бы зафиксировать событие для каждого узла, проверенного или нет, вместе с их идентификаторами. Я пытался использовать API плагинов jstree, например change_state(), check_node() или select_node(), но это не работает. Также я хотел бы получить все данные выбранных узлов в массиве для дальнейшей обработки. Кто-нибудь может помочь?

Спасибо...


person user529011    schedule 28.01.2011    source источник
comment
какой плагин jstree вы используете?   -  person Vivek    schedule 28.01.2011
comment
@Vivek, вероятно, jquery.jstree. @user529011 user529011 Можете ли вы привести пример кода, который вы используете. Возможно, изолируйте свою проблему на jsfiddle.net.   -  person Raynos    schedule 28.01.2011
comment
функция checked_unchecked(){ $.jstree._reference(#demo).get_selected(); } это дает мне объект, но не имеет идентификаторов для проверенных элементов. Также пытался связать check_node и select_node как .jstree().bind(check_node.jstree,function(data){ alert(data); }), но безрезультатно   -  person user529011    schedule 28.01.2011


Ответы (2)


Мне нравится плагин jstree, но он плохо документирован и не соответствует, скажем, стандартам jquery ui для разработки плагинов. Я использовал 1.0rc2, чтобы выполнить то, что вы пытаетесь сделать.

Вы должны связать «загруженное» событие перед созданием экземпляра jstree, поэтому я предполагаю, что это то же самое с событием «change_state». Еще одна вещь, на которую следует обратить внимание, это то, что «change_state» — это больше, чем просто изменение из-за флажка. Например, он также будет срабатывать, когда вы расширяете узел (но не сворачиваете его по какой-то причине). Тем не менее, я проверяю обработчик «change_state», чтобы попытаться отфильтровать нежелательные события из-за изменения флажка. Минимальный код для касания обработчика

$("#treeElement").bind("change_state.jstree", function (e, d) {
    var tagName = d.args[0].tagName;
    var refreshing = d.inst.data.core.refreshing;
    if ((tagName == "A" || tagName == "INS") &&
      (refreshing != true && refreshing != "undefined")) {
    //if a checkbox or it's text was clicked, 
    //and this is not due to a refresh or initial load, run this code . . .
    }
});

Ваш щелкнутый элемент тогда будет d.rslt, и вы можете получить проверенные элементы с помощью d.inst.get_checked() только для элемента, по которому щелкнули, или d.inst.get_checked(d.rslt) для объекта, содержащего проверенные подузлы. Используйте функцию jquery .each для обработки узлов.

person Toadmyster    schedule 31.03.2011
comment
Какой смысл писать плагин для чекбоксов для дерева данных без очевидного API событий?! Похоже на небольшую оплошность! - person rgvcorley; 18.07.2012
comment
Я беру это назад - события check_node.jstree и uncheck_node.jstree запускаются, просто этого нет в документации для jstree. - person rgvcorley; 18.07.2012
comment
Как получить атрибуты только выбранного элемента (т.е. d.rslt)? @Toadmyster - person Shibankar; 08.01.2015

Текущая версия jstree, похоже, имеет проблему с привязкой check_node.jstree. Также привязка select_node.jstree не срабатывает, если плагин флажка активен в текущей версии.

Перейдите на ЗДЕСЬ, где вы можете задать вопросы создателю или даже просмотреть уже заданные вопросы.

Что касается $.jstree._reference("#demo").get_selected();, вы можете получить идентификатор каждого элемента, используя $.jstree._reference("#demo").get_selected().each(function(index,element){alert($(element).attr("id"));});

person Bob    schedule 02.02.2011
comment
Небольшое примечание: в новой версии jstree используется ссылка (без начального подчеркивания). - person Nathan Crause; 20.01.2014