Yahoo! UI Library: TreeViewの基本(その2)

先の例では、HTMLのbody内にかかれたリストから、TreeViewを構成したが、これと同じことが、JSON形式で書かれたものでできる。

以下が、YUI TreeViewのトップページに書かれている例だが、はなはだしく見にくい。
こんなに括弧がならんでいるのをみると、大学時代にやらされたLISPを思い出してしまう。
そういえば、PHPPEARにあるHTML_MENUもこういった形式からメニュー(TreeView)を生成する。

[ 
       	{type:"text", label:"List 0", children: [
               	 {type:"text", label:"List 0-0", children: [
               	               "item 0-0-0",
               	               "item 0-0-1"
               	  ]},
               	  {type:"text", label:"item 0-1", children: [
               	       {type:"text", label:"Google", href:"http://www.google.jp", 
                  	       target:"_new", title:"google", children: [
               	                          "item 0-1-0",
               	                          "item 0-1-1"
               	        ]}
               	  ]}
       ]}
]

YUIのページには、先の例と同じ結果が得られると書かれているのだが、括弧をあわせていて、違うTreeができるのに気がついた。

以下が、上の形式から作成されるTree(閉じた状態)である。

これを展開したのが以下の図である。

以下に、Javascriptを含むHTML全文を示す。
違う、Treeではあるが、同じ手続きでTreeViewをrenderingできることがわかる(TreeViewのインスタンス生成時の第2引数に、このJSONデータを指定する部分が違うだけである)。
また、この例では、

    tree.subscribe("expand", function(node) {
      alert("[index: "+node.index + ", label: " + node.label + 
	   "] was expanded");
    });

の部分で、treeの各ノードのexapndイベントで、ノードの連番(index)とラベル(label)をalert表示するようにしてある。
これらのノードプロパティーは、TreeView生成時に自動的にnodeオブジェクトに生成される。
expandイベントは、ノードの展開時、テキスト(それが、末端(つまりleaf)であっても)クリック時に発火する。

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>Ajax_Sampling</TITLE>
<style type="text/css">
body {
	margin:0;
	padding:0;
}
</style>
<link rel="stylesheet" type="text/css" href="scripts/yui/fonts/fonts-min.css" />
<link rel="stylesheet" type="text/css" href="scripts/yui/treeview/assets/skins/sam/treeview.css" />

<style type="text/css" id="defaultstyle">
#container {
	margin: 2px;
	padding: 3px;
	width: 300px;
	height: auto;
	border:1px dashed #999999;
}
#treeDiv1 {
	background: #fff; 
	padding:1em;
}
</style>

<!-- 読み込むjs --> 
<script type="text/javascript" src="scripts/yui/yahoo-dom-event/yahoo-dom-event.js" >
</script> 
<script type="text/javascript" src="scripts/yui/treeview/treeview-min.js" ></script>

<script type="text/javascript">
//alert("init");
//モジュールパターンで実装する。
YAHOO.namespace("EGP");

YAHOO.EGP.BasicTree = function() {
	var tree;
	// Tree NOdeをオブジェクトリテラルの階層で表現
	var treeNodes= [ 
        	{type:"text", label:"List 0", children: [
                	 {type:"text", label:"List 0-0", children: [
                	               "item 0-0-0",
                	               "item 0-0-1"
                	  ]},
                	  {type:"text", label:"item 0-1", children: [
                	       {type:"text", label:"Google", href:"http://www.google.jp", 
                    	       target:"_new", title:"google", children: [
                	                          "item 0-1-0",
                	                          "item 0-1-1"
                	        ]}
                	  ]}
            ]}
        ];
    
    var buildTextNodeTree = function() {
	
    //treeのインスタンス化
    tree = new YAHOO.widget.TreeView("treeDiv1",treeNodes);
    tree.subscribe("expand", function(node) {
      alert("[index: "+node.index + ", label: " + node.label + 
	   "] was expanded");
    });

	//treeの描画
        tree.draw();
    };
	
    return{
    	init: function() {
	    	//alert("start");
        	buildTextNodeTree();
    	}
    };
    
}();

//DOMが完全にloadされたら、サンプルを初期化する。
YAHOO.util.Event.onDOMReady(
	 //DomReadyイベントで発火するハンドラ
	YAHOO.EGP.BasicTree.init,
	//ハンドラに渡すオブジェクト(関数)
	YAHOO.EGP.BasicTree,
	//ハンドラは、上記のオブジェクトのスコープをもつ。   
	true
);
</script>
</HEAD>

<!-- class=" yui-skin-sam"の指定が必要 -->
<BODY class=" yui-skin-sam">
<div id="container">
<p>
階層化されたオブジェクト定義から生成されるTreeです。
</p>
<div id="treeDiv1">
</div>
</div>
</BODY>
</HTML>