-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDOMTree.html
155 lines (143 loc) · 5.23 KB
/
DOMTree.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
<!DOCTYPE html>
<html>
<head>
<title>HTML DOM Tree</title>
<meta name="description" content="Interactive diagram showing the structure of the HTML DOM of this HTML page." />
<!-- Copyright 1998-2016 by Northwoods Software Corporation. -->
<meta charset="UTF-8">
<script src="go.js"></script>
<link href="../assets/css/goSamples.css" rel="stylesheet" type="text/css" /> <!-- you don't need to use this -->
<script src="goSamples.js"></script> <!-- this is only for the GoJS Samples framework -->
<script id="code">
var names = {}; // hash to keep track of what names have been used
function init() {
if (window.goSamples) goSamples(); // init for these samples -- you don't need to call this
var $ = go.GraphObject.make; // for conciseness in defining templates
myDiagram =
$(go.Diagram, "myDiagramDiv",
{
initialAutoScale: go.Diagram.UniformToFill,
// define the layout for the diagram
layout: $(go.TreeLayout, { nodeSpacing: 5, layerSpacing: 30 })
});
// Define a simple node template consisting of text followed by an expand/collapse button
myDiagram.nodeTemplate =
$(go.Node, "Horizontal",
{ selectionChanged: nodeSelectionChanged }, // this event handler is defined below
$(go.Panel, "Auto",
$(go.Shape, { fill: "#1F4963", stroke: null }),
$(go.TextBlock,
{ font: "bold 13px Helvetica, bold Arial, sans-serif",
stroke: "white", margin: 3 },
new go.Binding("text", "key"))
),
$("TreeExpanderButton")
);
// Define a trivial link template with no arrowhead.
myDiagram.linkTemplate =
$(go.Link,
{ selectable: false },
$(go.Shape)); // the link shape
var nodeDataArray = [];
// Walk the DOM, starting at document
function traverseDom(node, parentName) {
// skip everything but HTML Elements
if (!(node instanceof Element)) return;
// Ignore the menu on the left of the page
if (node.id === "menu") return;
// add this node to the nodeDataArray
var name = getName(node);
var data = { key: name, name: name };
nodeDataArray.push(data);
// add a link to its parent
if (parentName !== null) {
data.parent = parentName;
}
// find all children
var l = node.childNodes.length;
for (var i = 0; i < l; i++) {
traverseDom(node.childNodes[i], name);
}
}
// Give every node a unique name
function getName(node) {
var n = node.nodeName;
if (node.id) n = n + " (" + node.id + ")";
var namenum = n;
var i = 1;
while (names[namenum] !== undefined) {
namenum = n + i;
i++;
}
names[namenum] = node;
return namenum;
}
// build up the tree
traverseDom(document.activeElement, null);
// create the model for the DOM tree
myDiagram.model =
$(go.TreeModel, {
isReadOnly: true, // don't allow the user to delete or copy nodes
nodeDataArray: nodeDataArray
});
}
// When a Node is selected, highlight the corresponding HTML element.
function nodeSelectionChanged(node) {
if (node.isSelected) {
names[node.data.name].style.backgroundColor = "lightblue";
} else {
names[node.data.name].style.backgroundColor = "";
}
}
</script>
</head>
<body onload="init()">
<div id="sample">
<h3>HTML DOM Tree</h3>
<!-- The DIV needs an explicit size or else we won't see anything. -->
<div id="myDiagramDiv" style="border: 1px solid blue; width:100%; height:300px"></div>
<p>
This sample shows the DOM (Document Object Model) of this webpage displayed as a tree.
Each Node in the Diagram shows information about the corresponding HTML element in the DOM.
</p>
<p>
When a node is selected, the background color of the corresponding HTML Element changes to lightblue.
Below the diagram are some more HTML elements to illustrate the effect.
This sample also makes use of the <a href="../intro/buttons.html" target="_blank">TreeExpanderButton</a>,
which allows for parent nodes to expand and collapse their child nodes. Buttons are defined in <a href="../extensions/Buttons.js">Buttons.js</a>.
</p>
<p id="lastParagraph">
Elements with an id attribute are noted in parenthesis.
</p>
<div id="otherInfo">
<div id="tableContainer" style="display: inline-block;">
<table style="border: 1px; border-collapse: collapse;">
<tr>
<th id="firstHeader">Table header</th>
<th id="secondHeader">Table header 2</th>
</tr>
<tr>
<td>row 1, cell 1</td>
<td>row 1, cell 2</td>
</tr>
<tr>
<td>row 2, cell 1</td>
<td>row 2, cell 2</td>
</tr>
</table>
</div>
<div id="listContainer" style="display: inline-block; border: 1px solid gray; margin-left: 10px; width: 100px">
<p>My grocery list</p>
<ul id="groceryList">
<li>Coffee</li>
<li>Milk</li>
<li>Bread</li>
</ul>
</div>
<p>
For more uses of the <a>TreeLayout</a> see the <a href="DOMTree.html">DOM Tree</a> and <a href="visualTree.html">Visual Tree</a> samples.
</p>
</div>
</div>
</body>
</html>