2010-06-01 1 views
3

많은 노드를 보유하고있는 Jstree가 있고 그 중 일부는 동일한 ID를 가지고 있습니다.동일한 ID를 보유한 모든 노드를 선택하는 방법

누군가가
노드 중 하나를 선택하면 동일한 ID를 가진 모든 노드를 선택하도록 만드는 방법은 궁금합니다.

나는

onselect: function (node) { 

작업을 시도하지만 정확히 어떻게해야 할 아니에요,
을 플러스 나는 그것이 모두 함께 할 있기 때문에 수동 (노드
를 선택하는 방법을 잘 모르겠어요 선택한 : 속성)

+0

동일한 ID는 좋은 습관이 아닙니다 .... – Reigel

+0

': selected' 속성을 의미합니까? 이 경우 '

답변

3

그래서 어딘가에서 데이터를 가져와 정리해야하기 때문에이 작업을 수행해야한다고 가정합니다. 가능한 경우 문제의 원인을 수정하십시오.

그러나 일치하지 않는 경우 트리에서 일치하는 ID를 찾는 요소를 반복 할 수 있습니다. 이 같은 (트리의 모든 하위 요소 일치) 잠재적으로 큰 중간 배열을 생성한다

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

. 이것은 잘못된 문서 구조 (다중 ID)를 사용하여 무언가를하려고하기 때문에 jQuery의 멋진 래퍼보다는 지루하고 오래된 DOM 트래버 설을 사용하는 것이 가장 좋은 곳일 수 있습니다. 여기

는 대상 ID를 찾고 원시 DOM 탐색이 어떻게 보이는지의 다음 element 인수가 DOM 요소 (안 jQuery를 객체 또는 텍스트 노드 등이 실제로 있다고 가정

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

). 요소의 id을 확인한 다음 필요할 경우 재귀 적으로 자식을 처리합니다. 이렇게하면 잠재적으로 큰 배열을 만들지 않아도됩니다.

트리 노드를 참조 했으므로 리프 노드가 아닙니다. 나무가로드 될 때 한 번만이 작업을 수행하려면 트리 내의 노드가   —으로 선택 될 때뿐만 아니라 잘못된 구조를 가능한 한 짧게 유지하고 사전에 문제를 해결하기를 원하기 때문입니다.

+0

몇 가지 좋은 아이디어가 있지만, 노드에 조상 인 노드에 중복 ID가 있으면 어떻게 될까요? –

+0

@Erik : 나는 그것을 갱신 할 것이고, OP가 노드의 노드를 가리키고 있다고 가정하지만, 나는 오인이라고 생각한다. 감사. –

0

T.J Crowder 이미 언급했듯이 ID는 문서 내에서 고유해야합니다. ID가 중복되면 jsTree에 이상한 결과가 발생할 수 있으므로 다음을 수행하는 것이 좋습니다.

클릭하는 각 노드에 대해 아래 예제에서 id 속성 값을 var nodeId에 저장하십시오. 예제 코드에서는 var nodeId의 중복 파일을 찾습니다. 중복을 발견하면 처음 발견 된 노드를 제외하고 모두 고유 ID로 변경된 ID를 가져야합니다. id에 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가 직접 페이지로드 후 발견되는 대체 솔루션입니다.

$('[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. 
    } 
    } 
});