2015-05-06 2 views
2

Есть ли способ создать пользовательскую разметку или добавить дополнительные элементы html для некоторых узлов.jstree custom node markup

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

Есть ли способ настроить или добавить дополнительные элементы html на селективные узлы дерева и программно открыть контекстное меню или событие щелчка ссылки.

ответ

3

Лучший способ добиться этого - использовать плагин, вы можете посмотреть похожие плагины здесь: https://github.com/vakata/jstree/blob/master/src/misc.js (например, плагин с вопросительным значком).

Вот грубый демо, изменять по мере необходимости: http://jsfiddle.net/DGAF4/490/

(function ($, undefined) { 
    "use strict"; 
    var img = document.createElement('IMG'); 
    img.src = "http://jstree.com/tree-icon.png"; 
    img.className = "jstree-contextmenubtn"; 

    $.jstree.plugins.contextmenubtn = function (options, parent) { 
     this.bind = function() { 
      parent.bind.call(this); 
      this.element 
       .on("click.jstree", ".jstree-contextmenubtn", $.proxy(function (e) { 
         e.stopImmediatePropagation(); 
         $(e.target).closest('.jstree-node').children('.jstree-anchor').trigger('contextmenu'); 
        }, this)); 
     }; 
     this.teardown = function() { 
      this.element.find(".jstree-contextmenubtn").remove(); 
      parent.teardown.call(this); 
     }; 
     this.redraw_node = function(obj, deep, callback, force_draw) { 
      obj = parent.redraw_node.call(this, obj, deep, callback, force_draw); 
      if(obj) { 
       var tmp = img.cloneNode(true); 
       obj.insertBefore(tmp, obj.childNodes[2]); 
      } 
      return obj; 
     }; 
    }; 
})(jQuery); 
+0

Спасибо большое, да, я посмотрел на одном из вашего ответа в списке рассылки, и я смотрел плагин для вопросительного знака, посмотрел на ваш jsfiddle, это именно то, что я ищу. Тем не менее, есть еще одна вещь, которую я не могу найти, она показывает кнопку изображения для каждого узла, однако мне нужно показать imgbutton только для узлов certrain. Внутри redraw_node, как я могу получить узел, или исходные данные json для узла? так что я могу условно выполнить obj.insertBefore –

+1

Попробуйте выйти из 'console.log (this.get_node (obj));' перед вызовом родительской функции (в качестве первой строки функции redraw_node). Это должно быть то, что вам нужно – vakata

+0

Как изменить положение/координаты контекстного меню? @vakata –

0

С jstree версии 3.3.0 вы можете использовать node_customize plugin

$("#category-tree").jstree({ 
    core: { 
    data: nodes 
    }, 
    node_customize: { 
    default: function(el, node) { 
     $(el).find('a').append(arrowHtml) 
    } 
    }, 
    plugins: ['node_customize'] 
})