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

2009/3/19 ; サンプルコードをFF3以外(Chrome1、Safari3)で動かすとエラーになるため、修正。

                                        • -

次は、「Yahoo! UI Library: TreeViewの基本(その1)」で使った以下のDOMをHTTPサーバーに配置し、Connection Managerを使ってXHR(XMLHttpRequest)で非同期に取得し、TreeViewを構築・表示してみる。

<ul>
	<li>List 0
		<ul>
			<li>List 0-0
				<ul>
					<li>item 0-0-0</li>
					<li>item 0-0-1</li>
				</ul>
			</li>
		</ul>
	</li>
	<li>item 0-1
		<ul>
			<li><a target="_new" href="http://www.google.co.jp"
                          title="google">Google</a>
				<ul>
					<li>item 0-1-0</li>
					<li>item 0-1-1</li>
				</ul>
			</li>
		</ul>
	</li>
</ul>

このDOMファイルは、リモートサーバーではなく、「(下に示す)HTMLファイルをレスポンスするサーバー」のドキュメントディレクトリ配下に、data/ajax_menu1.txtとして配置した(エンコーディングUTF-8)。

初期画面は以下である。

この画面中にある「Treeの取得」をクリックすると、ajax_menu1.txtを非同期に取得して、そのCallBack関数にてTreeViewを構成する。以下は取得直後の画面。TreeViewの挙動は「Yahoo! UI Library: TreeViewの基本(その1)」の例と同様である。

また、YUIのTreeViewには、逐次的にデータを取得するDynamic Loadingの機能があるが、この例では、Connection Managerをつかい、XHRで一気に取得する。

以下に、Javascriptを含むHTMLの全ソースを示す。

<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: 350px;
	height: auto;
	border:1px dashed #999999;
}
#treeDiv1 {
	background: #fff; 
	padding:1em;
}

/*擬似リンク*/
.lnk {
	color: blue;
	text-decoration: underline;
	cursor: pointer;
    visibility: visible;
}

</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" src="scripts/yui/connection/connection-min.js" >
</script> 

<script type="text/javascript">
//alert("init");

var Event = YAHOO.util.Event,
	Get    = YAHOO.util.Get,
	Dom    = YAHOO.util.Dom,
	tree;

//module patternではうまくかけなかった。(スコープの問題??)
	ajaxHandlers = {
		
		// 受信成功時の処理
		responseSuccess:function(oj){
			//alert("success");
                // FF3以外でparseエラーが出るため修正(2009/3/19)
         	var menu = oj.responseText;
         	//var menu = eval(oj.responseText);
			//alert(menu);
         	if(menu) {
				Dom.get('treeDiv1').innerHTML = menu;
         	} else {
				alert("メニューが取得できませんでした。");
         	}
         	
 	     	YAHOO.util.Event.onAvailable('treeDiv1',
				function(){
 	     			//Treeのインスタンス化:
 		       	 	tree = new YAHOO.widget.TreeView('treeDiv1');
 	     	     	tree.draw();
 	     		}
 	     	);
		},

		// 受信失敗時の処理
		responseFailure:function(oj){
			alert("failure");
			alert("メニューが取得できませんでした(2)。");
		},

		// テキストを読み込む
		startRequest :function(url){
 	        YAHOO.util.Connect.asyncRequest('GET', url, 
					ajaxCallback, null);
		} 		
	};

	// コールバック成功/失敗時の振り分け
	ajaxCallback =
	{
		success:ajaxHandlers.responseSuccess,
		failure:ajaxHandlers.responseFailure,
		// cache: falseのしないと、HttpServerがajax_test2.xml
		// の内容をcacheしてしまう。
		cache: false,
		scope: ajaxHandlers
	};

	// 擬似リンクの処理
	// ハンドラを定義
	lnkHandlers =
	{
		click:function(){
			ajaxHandlers.startRequest('data/ajax_menu1.txt')
		}
	}
	//擬似リンクにイベントを仕掛ける。lnk1がAvailableになってからだよ。
	YAHOO.util.Event.onAvailable('lnk1',
		function() {
			YAHOO.util.Event.on('lnk1','click',
					lnkHandlers.click);
		}
	);

</script>
</HEAD>

<!-- class=" yui-skin-sam"の指定が必要 -->
<BODY class=" yui-skin-sam">
<div id="container">
<p>
<h4>ノードリスト(HTML)を受信してTreeを作成します</h4>
</p>
<div id='lnk1' class="lnk">Treeの取得</div>
<div id="treeDiv1"></div>
</div>
</BODY>
</HTML>