2010-06-01 2 views
3

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

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

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

onselect: function (node) { 

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

+0

такой же идентификатор не является хорошей практикой .... – Reigel

+0

Вы имеете в виду атрибут ': selected'? В этом случае, если будет работать только для '

ответ

3

IDs must be unique within the document, поэтому я предполагаю, что вам нужно это сделать, потому что вы получаете данные откуда-то и должны их очистить. Если возможно, исправьте источник проблемы.

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

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

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

Вот что сырой DOM обход ищет целевой ID может выглядеть следующим образом:

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 и затем обрабатывает его дочерние элементы, при необходимости рекурсивно. Это позволяет избежать создания потенциально большого массива.

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

+0

Некоторые хорошие идеи, но что, если дублирующие идентификаторы существуют на узлах, которые являются предками узла? –

+0

@Erik: Я обновлю это, я предположил, что OP ссылается на узел дерева с 'node', но я подозреваю, что ошибся. Благодарю. –

0

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. 
    } 
    } 
}); 

Update: Это альтернативное решение, в котором дублированные идентификаторы находятся непосредственно после загрузки страницы, похожее на предложение T.J Crowder в.

$('[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. 
    } 
    } 
}); 
Смежные вопросы