jsTree отключить перемещение некоторых узлов

У меня есть один jsTree, и я хочу, чтобы некоторые из его узлов можно было перемещать. Корневой узел и его непосредственные дочерние элементы не могут быть перемещены.

Я использую crrm, и он работает так, как ожидалось, но по-прежнему позволяет мне перетаскивать все узлы, даже те узлы (сразу ниже корня), которые нельзя никуда перетащить. Я не хочу, чтобы их вообще можно было перетаскивать, т.е. пользователь вообще не мог их забрать.


person Ali    schedule 25.06.2012    source источник


Ответы (3)


В текущей версии jsTree (3.0.8) вы делаете это:

$('#my_jstree')
            .jstree({
                "core" : {
                    "check_callback" : true
                },
                "dnd" : {
                    "is_draggable" : function(node) {
                        console.log('is_draggable called: ', node[0]);
                        if (node[0].type != 'MY-DRAGGABLE-TYPE') {
                            alert('this type is not draggable');
                            return false;
                        }
                        return true;
                    }
                },
                "types" : {
                    "default" : {
                        "icon" : "glyphicon glyphicon-flash"
                    },
                    "MY-DRAGGABLE-TYPE" : {
                        "icon" : "glyphicon glyphicon-info-sign"
                    }
                },
                "plugins" : [ "dnd", "types" ]})

Используйте функцию is_draggable вместе с плагином типов, чтобы управлять тем, что можно перетаскивать. Если вы хотите увидеть, что значки, которые я использовал, включают таблицу стилей глификонов начальной загрузки. Код здесь предполагает, что у вас уже есть div и список для jstree в вашем HTML. Я опубликую plunkr, если кто-то не сможет понять приведенный выше код.

РЕДАКТИРОВАТЬ - чтобы предотвратить падение, сделайте следующее:

"core" : {
                    "check_callback" : function(operation, node, node_parent, node_position, more) {
                        if (operation == 'move_node') {
                            console.log(node_parent);
                            if (node_parent.type == 'MY-DROPPABLE-TYPE') {
                                return true
                            } else
                                return false;
                        }
                    }
                },

Используйте функцию check_callback для отображения типа droppable. Используйте node_parent, чтобы получить droppable.

person cmzmuffin    schedule 03.01.2015
comment
Это была огромная помощь. Спасибо. - person DavidHyogo; 20.02.2015
comment
Спасибо за добавление возможности предотвращения падения, это было именно то, что я искал. - person Yogurt The Wise; 26.08.2016
comment
согласованный. TS должен принять этот ответ. Спасибо приятель. - person Jacky Supit; 02.11.2017
comment
Спасибо - старый пост я знаю, но отлично решил мою проблему! - person AdrianD; 15.11.2018
comment
Я добавлял атрибут li при заполнении узла. Основываясь на вашем примере, я нашел такое решение. Спасибо. if (operation == 'move_node') { //console.log(node_parent); //console.log(node.li_attr); if(node.li_attr.nodetype != 16) {возвратить false} else {вернуть true}} - person Serdar Karaca; 29.01.2021

Задан аналогичный вопрос, посмотрите мой ответ: , как ограничить сброс до определенных типов узлов?

В функции crrm.move.check_move должен быть какой-то тест на запах. В вашем случае это будет корень и первые дети.

person MMeah    schedule 25.06.2012
comment
Похожее, но не то, что я прошу здесь. crrm check_move бесполезен для моей проблемы. Это только мешает мне удалить перетаскиваемый узел. Я не хочу, чтобы пользователь мог перетаскивать узлы, которые нельзя никуда отбросить. - person Ali; 26.06.2012

Я думаю, что вам нужно drag_check

 "dnd"  :   {

        "drop_target"   :   false,


        "drag_check"    :   function(data)

        {  
          if( data.r.attr("id") ==  ... ) 
                    return false;
           //if you want to enable drag for certain nodes  return following
           return {
                    after : true,
                    before : false,
                    inside : false
                }
          }
person Dipesh KC    schedule 17.08.2012
comment
Я считаю, что обратные вызовы dnd выполняются только при перетаскивании внешнего объекта. Вопрос был об узле внутри дерева. - person Marc Rochkind; 28.09.2013