Ajaxの習作:MSDNのツリー(ぽい物)を実現する。

フェーズ2

 JSON形式のデータを使う(スクリプトに埋め込む)

ツリーデータは、HTMLに埋め込んでも実現できるのですが、スマートではありません。
htmlファイルとは別のファイルにツリーデータだけを格納して置く方が使い勝手が良くなります。

ツリー状のデータを扱えるデータ形式と言うと、XMLが第一に思い浮かぶ事でしょう。
Ajaxは、XMLを扱い易いのですが、しかし、ツリーデータとしてはちょっと大袈裟です。
JavaScriptと親和性の高いJSONがあります。JSONは、軽量で加工がしやすいので、JSONを使用します。
JSONデータの説明は、ここを参照してください。

本フェーズでは、ツリーデータをhtmlファイルに埋め込みます。(初めに書いたことはどこへ行ったのかなぁ?きっとフェーズ3に行ったに違いない。)
別ファイルを読み込むのは一手間必要ですので、今回は埋め込みと言うことで・・・。
と、その前にツリーを表示するためのデータの設計をします。
ツリーに最低限必要なものとは、
  1. 要素の構造的には、1つの要素とその子の要素(複数)。一番上の要素は1つのみ。
  2. 1つの要素には、表示名称、リンク先。
といったところでしょうか。
これをJSON形式で記述すると以下のようになります。

{"text":"トップページ", "url":"top.html","child":[
	{"text":"子1", "url":null, "child":[
		{"text":"孫11", "url":grandchild11.html, "child":null},
		{"text":"孫12", "url":null, "child":[
			{"text":"ひ孫121", "url":great-grandchild121,html, "child":null}
		]}
	]},
	{"text":"子2", "url":null, "child":[
		{"text":"孫21", "url":grandchild21,html, "child":null},
		{"text":"孫22", "url":null, "child":[
			{"text":"ひ孫221", "url":great-grandchild221,html, "child":null}
		]}
	]}
]}
上記のデータをツリーにして見ます。今回は、+/-記号のところでツリーの展開・格納を出来るようにします。

ソースは、以下になります。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Ajax Tree</title>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" href="./css/kotatu.css" type="text/css" title="Default">
<script language="javascript">
<!--
var listContents = {
"text":"トップページ", "url":"top.html","child":[
	{"text":"子1", "url":null, "child":[
		{"text":"孫11", "url":"grandchild11.html", "child":null},
		{"text":"孫12", "url":null, "child":[
			{"text":"ひ孫121", "url":"great-grandchild121.html", "child":null}
		]}
	]},
	{"text":"子2", "url":null, "child":[
		{"text":"孫21", "url":"grandchild21.html", "child":null},
		{"text":"孫22", "url":null, "child":[
			{"text":"ひ孫221", "url":"great-grandchild221.html", "child":null}
		]}
	]}
]};

function changeContent(tURL){
	parent.main.location.href=tURL;
}
function changeDiv(tName, tMsg)
{
	if(document.all || document.getElementById) {
		if(document.all) {
			document.all(tName).innerHTML=tMsg;
		} else {
			document.getElementById(tName).innerHTML=tMsg;
		}
	} else {
		if(document.layers) {
			with(document.layers(tName)) {
				document.open();
				document.write(tMsg);
				document.close();
			}
		}
	}
}

function getDiv(tName)
{
	var obj=null;
	if(document.all || document.getElementById) {
		if(document.all) {
			obj = document.all.item(tName);
		} else {
			obj = document.getElementById(tName);
		}
	} else {
		if(document.layers) {
			obj = document.layers(tName);
		}
	}
	return obj;
}
function exMenu(tName)
{
	var i;
	tMenu = getDiv(tName).style;
	if (tMenu.display=="none") {
		tMenu.display = "block";
		changeDiv(tName + "_", "-");
	} else {
		tMenu.display = "none";
		changeDiv(tName + "_", "+");
	}
}

function writeList(objList, level, pareContName, bIsEdge) {
	var i;
	var len=0;
	var contentsName='';
	var objChildList=null;
	var id;
	var contentsName

	document.write('<p class="nowrap">');
	if(level > 1){
		for(i=1;level>i;i++){
			if(!bIsEdge[i]){
				document.write('│');
			}else{
				document.write(' ');
			}
		}
	}
	if(level>0){
		if(!bIsEdge[level]){
			document.write('├');
		}else{
			document.write('└');
		}
	}

	contentsName=objList.text;
	id=pareContName+'_'+contentsName;

	if(objList.child!=null) {
		objChildList=objList.child;
		document.write('<a class="brunch" onclick="exMenu(\''+id+'\')"><span class="brunch" id="'+id+'_'+'">');
		document.write('-</span></a>');
	} else {
		document.write('<span class="nobrunch">・</span>');
	}
	if(objList.url!=null){
		document.write(' <a class="nowrap" href="'+objList.url+'")">'+contentsName+'</a><br>');
	}else{
		document.write(' '+contentsName+'<br>');
	}
	document.write('</p>');

	if(objChildList!=null){
		document.write('<div class="nowrap" id="'+id+'" style="DISPLAY:block">');
		len=objChildList.length;
		var childID;
		for(i=0;len>i;i++){
			bIsEdge[level+1]=(len-1==i);
			childID=id;
			this.writeList(objChildList[i],level+1,childID,bIsEdge);
		}
		document.write('</div>');
	}
}
// -->
</script>
</head>
<script langage="javascript">
var bIsEdge=new Array();
bIsEdge[0]=true;
writeList(listContents, 0, "", bIsEdge);
</script>
</body>
</html>
フェーズ2は以上でおしまい。次回フェーズ3ではJSONデータを動的に読み込みます。