2
0

More than 1 year has passed since last update.

jsTree を使ってオリジナルのデータをツリー表示する

Last updated at Posted at 2022-11-04

利用するライブラリ

jsTree というライブラリを利用します。
他のライブラリも検討したのですが、意外に?デファクトスタンダードというものが無く、これを採用しました。

ライセンスはMITとのことです。

ここでは他に bootstrap5, jquery 3.5.1 を利用しています。

難しかった点

サンプルを見ればツリー表示自体は難しくないのですが、むしろ「自分が表示したいデータを jsTreeのデータ形式に変換する」のが面倒でしたのでここにメモしておきます。

Code

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>jstree-example</title>
<!-- jQuery 3.5.1 -->
<script src="https://code.jquery.com/jquery-3.5.1.js"
	integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc="
	crossorigin="anonymous"></script>
<!-- bootstrap 5 -->
<link
	href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"
	rel="stylesheet"
	integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC"
	crossorigin="anonymous">
<!-- jstree -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js"></script>

<script type="text/javascript" class="init">
	// データ変換
	function parseTree(jstree,ptr,node){
		if(node.children != null && node.children.length > 0){
			var cc = new Array();
			if(node != null && node.children != null && node.children.length>0){
				for(var n=0;n<node.children.length;n++){
					var c = new Object();
					c.id = node.children[n].id;
					c.text = node.children[n].text;
					cc.push(c);
					// 再起呼び出し
					parseTree(jstree,c,node.children[n]);
				}
			}
			ptr.children = cc;
		}
	}
	// データ変換
	function toJsTreeNode(tree){
		var jstree = new Array();
		for(var n=0;n<tree.length;n++){
			var c = new Object();
			c.id = tree[n].id;
			c.text = tree[n].text;
			jstree.push(c);
			parseTree(jstree,c,tree[n]);
		}
		return jstree;
	}

	// 選択されたとき
	function nodeSelected(event,data){
	    console.log(data.node.id);
	}
	
	// 元のデータの例
	var originalData = [
		{
			id:"1",
			text:"aaa",
			children:[
				{id:"1-1",text:"bbb"},
				{id:"1-2",text:"ccc",
					children:[{id:"1-2-1",text:"ddd"},{id:"1-2-2",text:"eee"}]
				},
			],
		},
		{
			id:"2",
			text:"fff",
			children:[
				{id:"2-1",text:"ggg"},
				{id:"2-2",text:"hhh"},
			],
		}
	];
	
	$(document).ready(function() {
		// 初期化
		$.jstree.defaults.core.themes.variant = "large";
		$.jstree.defaults.core.themes.responsive = true;
		// データ変換
		var jstreeNode = toJsTreeNode(originalData);
		// 表示
		$('#jstree')
			// listen for event
			.on('select_node.jstree', nodeSelected)
			// create the instance
			.jstree({"core":{"multiple":false,"data":jstreeNode }});
		
	} // end of function
	); // end of .ready
</script>

</head>
<body class="m-3">
	<div class="row">
		<div class="col-12">
			<div id="jstree"><!-- ここにツリー表示 --></div>
		</div>
	</div>
</body>
</html>

実行結果

image.png

表示できました!

ひとこと

toJsTreeNode() と parseTree() はもうちょっとシンプルに書けそうな気がしています。

以上。

2
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0