多くのノードを保持するJstreeがあり、それらのいくつかは同じIDを持っています。
誰かが
ノードの 1 つを選択すると、同じ ID を持つすべてのノードが選択されるようにするにはどうすればよいでしょうか。
私は
onselect: function (node) {
しかし、正確に何をすればよい
かわかりません。また、ノードを手動で選択する方法もわかりません
(すべて selected: 属性で行われるため)。
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 回実行する必要があります。これは、無効な構造をできるだけ短時間だけ保持し、積極的に修正するためです。
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.
}
}
});