3

多くのノードを保持するJstreeがあり、それらのいくつかは同じIDを持っています。

誰かが
ノードの 1 つを選択すると、同じ ID を持つすべてのノードが選択されるようにするにはどうすればよいでしょうか。

私は

    onselect: function (node) {

しかし、正確に何をすればよい
かわかりません。また、ノードを手動で選択する方法もわかりません
(すべて selected: 属性で行われるため)。

4

2 に答える 2

3

IDはドキュメント内で一意である必要があるため、どこかからデータを取得してクリーンアップする必要があるため、これを行う必要があると思います。可能であれば、問題の原因を修正してください。

それができない場合は、ツリー内の要素をループして一致する 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 トラバーサルは次のようになります。

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、必要に応じて再帰的にその子を処理します。これにより、潜在的に大きな配列の作成が回避されます。

ここでは、ノード内の葉ではなく、ツリー ノードについて言及していることに注意してください。これは、ツリー内のノードが選択されたときだけでなく、ツリーがロードされたときに 1 回実行する必要があります。これは、無効な構造をできるだけ短時間だけ保持し、積極的に修正するためです。

于 2010-06-01T07:55:15.263 に答える
0

TJ Crowderはすでに、ID はドキュメント内で一意でなければならないと述べています。重複した ID があると、jsTree で非常に奇妙な結果になる可能性があると思うので、次のことをお勧めします。

クリックしているノードごとに、次var nodeIdの例の id 属性の値を保存します。サンプル コードは の重複を見つけvar nodeIdます。重複が見つかった場合は、最初に見つかったノードを除くすべてのノードの ID を一意の ID に変更する必要があります。iの値またはランダムなテキスト文字列を id に追加することで、これを行うことができます。

私が今あなたのためにできることはそれだけです。より詳細な情報 (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.
    }
  }
});

更新:これは、TJ Crowder の提案と同様に、重複した 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.
    }
  }
});
于 2010-06-01T09:26:23.973 に答える