Как выбрать каждый узел с одинаковым идентификатором - PullRequest
3 голосов
/ 01 июня 2010

У меня есть Jstree, который содержит много узлов, некоторые из них имеют одинаковый идентификатор.

Мне было интересно, как мне сделать так, чтобы, если кто-то выбрал
один из узлов, он будет выбирать каждый узел с одинаковым идентификатором.

Я пытался работать с

    onselect: function (node) {

но я не уверен, что именно делать,
плюс я не уверен, как вручную выбрать узел
(потому что все это делается с атрибутом selected:)

Ответы [ 2 ]

3 голосов
/ 01 июня 2010

идентификаторы должны быть уникальными в документе , поэтому я предполагаю, что вам нужно сделать это, потому что вы откуда-то получаете данные и должны их очистить. Если можете, исправьте источник проблемы.

Если вы не можете, однако, вы можете перебирать элементы в дереве в поисках соответствующего идентификатора; как то так:

var theTargetID = /* ...whatever ID you're looking for... */;
$(theTree).find("*").each(function(element) {
    if (this.id == theTargetID) {
        // it matches the ID
    }
});

Это создаст потенциально большой промежуточный массив (соответствующий всем дочерним элементам дерева). Это может быть место, где вам лучше использовать скучный старомодный обход DOM, а не красивые оболочки jQuery, поскольку вы пытаетесь что-то сделать с недопустимой структурой документа (несколько идентификаторов).

Вот как может выглядеть необработанный обход DOM для поиска идентификатора цели:

function traverse(theTargetID, element) {
    var node;

    if (element.id == theTargetID) {
        // It matches, do something about it
    }

    // Process child nodes
    for (node = element.firstChild; node; node = node.nextSibling) {
        if (node.nodeType === 1) {  // 1 == Element
            traverse(theTargetID, node);
        }
    }
}

Предполагается, что аргумент element на самом деле является элементом DOM (не объектом jQuery или текстовым узлом и т. Д.). Он проверяет элемент id и затем обрабатывает его дочерние элементы, если необходимо, рекурсивно. Это позволяет избежать создания потенциально большого массива.

Обратите внимание, что я имел в виду узел дерева, а не лист внутри него. Вы хотите сделать это один раз, когда дерево загружено, а не только когда выбран узел в дереве & mdash; потому что вы хотите иметь недопустимую структуру как можно более кратко и упреждающе ее исправить.

0 голосов
/ 01 июня 2010

A T.J Crowder уже сказал, идентификаторы должны быть уникальными в документе. Я думаю, что вы можете получить очень странный эффект в вашем jsTree при наличии дублированных идентификаторов, поэтому я бы порекомендовал вам сделать следующее.

Для каждого узла, на который вы нажимаете, сохраните значение атрибута id в var nodeId в приведенном ниже примере. Пример кода найдет дубликаты var nodeId для вас. Если вы найдете дубликаты, то все, кроме первого найденного узла, должны иметь уникальный идентификатор. Вы можете сделать это, добавив значение i или произвольную текстовую строку к идентификатору.

Это все, что я могу сделать для тебя сейчас. Если бы вы могли предоставить нам более подробную информацию (HTML и ваш текущий код Javascript), это помогло бы.

var nodeId = 'the-node-id'; // The id of your node id here.
$('#' + nodeId).each(function() {
  var matchingIds = $('[id='+this.id+']'); // May find duplicate ids.
  if (matchingIds.length > 1 && matchingIds[0] == this) {
    // Duplicates found.
    for (i = 0; i < matchingIds.length; i++) {
      // Whatever you like to do with the duplicates goes here. I suggest you give them new unique ids.
    }
  }
});

Обновление: Это альтернативное решение, в котором дублированные идентификаторы находятся непосредственно после загрузки страницы, аналогично предложению Т. Дж. Краудера.

$('[id]').each(function() { // Selects all elements with ids in the document.
  var matchingIds = $('[id='+this.id+']'); // May find duplicate ids.
  if (matchingIds.length > 1 && matchingIds[0] == this) {
    // Duplicates found.
    for (i = 0; i < matchingIds.length; i++) {
      // Whatever you like to do with the duplicates goes here. I suggest you give them new unique ids.
    }
  }
});
...