[JavaScript]树形菜单 DOM 脚本编程实例
晚上参考了网上的三级菜单的脚本写了个代码。效果为点击上级父菜单栏后,下级子菜单栏显示或是隐藏。
DOM 树型结构代码:
Code
<div id="menu">
<h3>论坛首页</h3>
<ul>
<li class="childNode1">
<a href="#">市场调查</a>
<ul>
<li>
<a href="#">子栏目</a>
<ul>
<li>
<a href="#">二级子栏目</a>
<ul>
<li>
<a href="#">三级子栏目</a>
</li>
</ul>
</li>
</ul>
</li>
<li>
<a href="">子栏目</a>
</li>
</ul>
</li>
<li class="childNode2"><a href="">会员讨论区</a></li>
<li class="childNode3"><a href="">趣味派派对</a></li>
<li class="childNode4"><a href="">伊人时尚</a></li>
<li class="childNode5"><a href="">超级水水吧</a></li>
<li class="childNode6"><a href="">行业信息转载</a></li>
<li class="childNode7"><a href="">会员事务受理区</a></li>
<li class="childNode8"><a href="">最新消息</a></li>
<li class="childNode9"><a href="">历史备案</a></li>
<li class="childNode10"><a href="">使用说明</a></li>
</ul>
</div>
<!-- end menu -->
JavaScript 程序代码:
1
function prepareMenuBar() {
2
menuBar('menu');
3
}
4
function menuBar(id) {
5
if(!document.getElementById || !document.getElementsByTagName ) return;
6
var oId = document.getElementById(id);
7
if(!oId) return;
8
var oList = oId.getElementsByTagName('ul');
9
var oLink = oId.getElementsByTagName('a');
10
11
for(var i=0; i<oLink.length; i++) {
12
oLink[i].onclick = function() {
13
if(this.nextSibling.nextSibling.style.display == 'block'){
14
this.nextSibling.nextSibling.style.display = 'none';
15
}
16
else {
17
this.nextSibling.nextSibling.style.display = 'block';
18
}
19
20
return false;
21
};
22
23
}
24
for(var j=0; j<oList.length; j++) {
25
oList[j].style.display = 'none';
26
}
27
oList[0].style.display = 'block';
28
}
29![]()
30
addLoadEvent(prepareMenuBar);
function prepareMenuBar() {2
menuBar('menu');3
}4
function menuBar(id) {5
if(!document.getElementById || !document.getElementsByTagName ) return;6
var oId = document.getElementById(id);7
if(!oId) return;8
var oList = oId.getElementsByTagName('ul');9
var oLink = oId.getElementsByTagName('a');10
11
for(var i=0; i<oLink.length; i++) {12
oLink[i].onclick = function() {13
if(this.nextSibling.nextSibling.style.display == 'block'){14
this.nextSibling.nextSibling.style.display = 'none';15
}16
else {17
this.nextSibling.nextSibling.style.display = 'block';18
}19
20
return false;21
};22
23
}24
for(var j=0; j<oList.length; j++) {25
oList[j].style.display = 'none';26
}27
oList[0].style.display = 'block';28
} 29

30
addLoadEvent(prepareMenuBar);
我们先通过DOM遍历找到该父节点的元素,再找出子节点元素,再DOM遍历,再这样下去,虽然这样可以编写出三级菜单,但这种编写方法还不够灵活,要知道:for遍历DOM节点是拖耗Web性能的。PPK说:你这样写是不行滴!要编写出更好的方法,先把目标事件对象弄清楚。偷偷告诉你哦:想不想用JavaScript写个无限级联的菜单?打住!这里暂且只写出三级菜单先。本人编写的 JavaScript 代码如下:
if(!document.getElementById || !document.getElementsByTagName) return;
var oId = document.getElementById(id);
if(!oId) return;
var oLink = oId.getElementsByTagName('a');
for(var i=0; i<oLink.length; i++) {
oLink[i].onclick = function(e) {
var evt = window.event || e;
var evtTarget = evt.target || evt.srcElement;
var node = evtTarget.nextSibling;
while(node.nodeType != 1 && node.nextSibling != null) {
node = node.nextSibling;
}
if(node.nodeName == 'UL'){
if(node.style.display == 'block') {
node.style.display = 'none';
}
else {
node.style.display = 'block';
}
}
return false;
};
}
不好意思,其实早就通过《PPK谈Javascript》学会了,可一直没时间写,现在分享给大家。enjoy!


浙公网安备 33010602011771号