/* Mastering JavaScript, Premium Edition by James Jaworski
ISBN:078212819X Publisher Sybex CopyRight 2001 */
<html> <head> <title>Tree Test</title> <style type="text/css"> BLOCKQUOTE { margin-top: -5; margin-bottom: -5; } TABLE { margin-top: 0; margin-bottom: 0; } A:link, A:visited { color: black; text-decoration: none; } </style> <script language="JavaScript"> var tree if(isNav4() && navigator.tree8487 != undefined) // Use a unique value to differentiate with other concurrent tree objects tree = navigator.tree8487 else tree = createTree() function isDOM1Capable() { if(document.getElementById) return true return false } function isIE4() { if(!isDOM1Capable() && document.all) return true return false } function isNav4() { if(navigator.appName == "Netscape" && parseInt(navigator.appVersion) >= 4 && parseInt(navigator.appVersion) < 5) return true return false } function createTree() { var nodes = new Array( "Tree Component", "Tackles problems of persistence and redisplay", "How can a complex object persist between page loadings?", "How can I redisplay a portion of a page?", "Exploits browser-unique features", "Navigator 4", "Uses <code>navigator</code> property for persistence.", "Internet Explorer 4 and DOM1-capable browsers", "Uses <code>innerHTML</code> property for redisplay", "Just a touch of DHTML", "Style sheets are used to shrink margins and hide links", "Easily tailored") var branches = new Array(new Array(0,1), new Array(0,4), new Array(0,10), new Array(0,11), new Array(1,2), new Array(1,3), new Array(4,5), new Array(4,7), new Array(5,6), new Array(7,8), new Array(7,9) ) branchID = 0 var subtrees = new Array() for(var i=0; i<nodes.length; ++i) subtrees[i] = new Tree(nodes[i]) for(var i=0; i<branches.length; ++i) subtrees[branches[i][0]].addBranch(subtrees[branches[i][1]]) return subtrees[0] } function Tree(root) { this.text = root this.id = branchID ++branchID this.expanded = true this.branches = new Array() this.addBranch = Tree_addBranch this.changeState = Tree_changeState this.handleClick = Tree_handleClick this.processClick = Tree_processClick this.display = Tree_display this.getTreeString = Tree_getTreeString } function Tree_addBranch(tree) { this.branches[this.branches.length] = tree } function Tree_changeState() { this.expanded = !this.expanded } function Tree_handleClick(branch) { this.processClick(branch) if(isNav4()) { navigator.tree8487 = tree window.location.reload() }else if(isDOM1Capable()) { var d = document.getElementById("tree") if(d != null) d.innerHTML = this.getTreeString() }else if(isIE4()) { var d = document.all("tree") if(d != null) d.innerHTML = this.getTreeString() } } function Tree_processClick(branch) { if(this.id == branch) this.changeState() else { for(var i=0; i<this.branches.length; ++i) this.branches[i].processClick(branch) } } function Tree_getTreeString() { var s = "<blockquote>" s += '<table border="0">' s += "<tr>" s += "<td>" if(this.branches.length > 0) s += '<a href="javascript:tree.handleClick('+this.id+')">+</a>' else s += "-" s += "</td>" s += "<td>" s += this.text s += "</td>" s += "</tr>" s += "</table>" if((this.branches.length > 0) && (this.expanded == true)) { for(var i=0; i<this.branches.length; ++i) s += this.branches[i].getTreeString() } s += "</blockquote>" return s } function Tree_display() { document.writeln(this.getTreeString()) } </script> </head> <body> <hr> <div id="tree"> <script language="JavaScript"> tree.display() </script> </div> <hr> </body> </html>
|