Подтвердить что ты не робот

Jstree jquery, как выполнять итерацию по всем узлам

Я пытаюсь выполнить итерацию через каждый node в дереве в jstree. Древовидное изображение имеет 4 уровня глубины, но я не могу пройти мимо 1-го уровня. Ниже приведен пример jQuery, используемый для итерации.

$("#myTree").bind('ready.jstree', function (event, data) {
    $('#myTree li').each(function () {
        // Perform logic here
        }
    });
});

Здесь - это jsfiddle, иллюстрирующий мою мысль. Пожалуйста, помогите, как я могу выполнять итерацию через каждый node в jstree.

4b9b3361

Ответ 1

Это приведет к тому, что все ваши дочерние элементы вашего дерева будут в плоском массиве для вашего цикла .each.

$("#tree").bind('ready.jstree', function(event, data) {
  var $tree = $(this);
  $($tree.jstree().get_json($tree, {
      flat: true
    }))
    .each(function(index, value) {
      var node = $("#tree").jstree().get_node(this.id);
      var lvl = node.parents.length;
      var idx = index;
      console.log('node index = ' + idx + ' level = ' + lvl);
    });
});

JSFiddle - Документы для get_json

Ответ 2

Другой способ - открыть их, прежде чем пытаться получить доступ к узлам в dom, а затем закрыть их:

$("#tree").bind('ready.jstree', function (event, data) {
  $(this).jstree().open_all(); // open all nodes so they are visible in dom
    $('#tree li').each(function (index,value) {
        var node = $("#tree").jstree().get_node(this.id);
        var lvl = node.parents.length;
        var idx = index;
        console.log('node index = ' + idx + ' level = ' + lvl);
    });
    $(this).jstree().close_all(); // close all again
});

Ответ 3

"Узлы" - это перегруженный термин. Вы имеете в виду узлы HTML или только данные JSON, используемые для определения каждого node в jstree? Мне нужно было выполнить итерацию через jstree, чтобы извлечь значение для поля ID в каждом jstree node. Если это все, что вам нужно, есть более простой подход:

var v =$("#tree").jstree(true).get_json('#', {'flat': true});
for (i = 0; i < v.length && i < 10; i++) {
    var z = v[i];
    alert("z[id] = " + z["id"]);
}

Ответ 4

Мне нужен библиотечный способ итерации над узлами jsTree, поэтому я написал это в файле jstree.js:

each_node: function(callback) {
    if (callback) {
        var id, nodes = this._model.data;
        for (id in nodes) {
            if (nodes.hasOwnProperty(id) /*&& id !== $.jstree.root*/) {
                callback.call(this, nodes[id]);
            }
        }
    }
},

(Примечание: я использую jsTree 3.3.4, и я вставил вышеуказанный код в строку 3712 сразу после определения функции get_json.)

В коде я могу выполнять итерацию через узлы дерева следующим образом:

$("#myTree").jstree(true).each_node(function (node) {
    // 'this' contains the jsTree reference

    // example usage: hide leaf nodes having a certain data attribute = true
    if (this.is_leaf(node) && node.data[attribute]) {
        this.hide_node(node);
    }
});