利用ASP和XML制作菜单导航系统
来源:网页教学 时间:06-12-25 点击: 点击这里收藏本文
currentNode.childNodes.item(0).text + "'" >" +
currentNode.childNodes.item(1).text +
"< /SPAN >< BR >
");
eval(startMenu + "_Array[i] = sMenuItem")
}
}
}
创建初始的数组(名为menu1_Array)之后,程序检查第一个< menuItem >标记是否含有子节点。要获得子节点的数量非常简单,只需访问父节点的childNodes.length属性即可得到。
检查子节点数量的时候,判断条件是childNotes.length属性是否大于1,这是因为节点中的文本也是一个节点,length值包含它。如果以等于1作为判断条件,即使唯一的子节点是文本节点而不是元素节点,if语句也将返回true(尽管我们还可以检查子节点的类型,但不如当前方法简洁)。
分析节点的同时,所有必需的< DIV >属性和客户端事件响应代码(文本)都保存到了变量sMenuItem,然而又把sMenuItem保存到数组,它在数组中的位置由当前在循环中的位置决定。如果当前节点包含元素类型的子节点,则调用walkTree()并将当前节点作为参数传递给它。
2.2 递归函数walkTree
所谓的递归函数,就是自己调用自己的函数。递归函数非常适合于处理层次结构的数据。在遍历XML树时,使用递归函数可以减少大量的代码,一个简单的递归结构可以处理数量庞大的子菜单。
walkTree()函数以一个节点为参数,与前面所讨论的过程类似,它将创建数组并检查childNode.length属性。下面是walkTree()的完整代码:
function walkTree(node) {
level += 1;
// 数组名字为DIV的名字加"_Array"
eval("var " + currentMenu + "_Array = new Array()")
for (var j=2;j< node.childNodes.length;j++) {
newNode = node.childNodes.item(j)
if (newNode.hasChildNodes() == true && newNode.childNodes.length >2) {
// 每一个节点拥有0=链接和1=文本节点
// 因此如仅有这些子节点则不必再次调用函数
currentMenu = currentMenu + "_" + (j-1);
thisMenu = currentMenu.substring(0,currentMenu.length-2);
sMenuItem = escape("< SPAN id="" + thisMenu + "_span" + (j-1) +
"" class='cellOff' " + "onMouseOver="stateChange('" + currentMenu +
"',this," + level + ")" onMouseOut="stateChange('',this,'')" >" +
image + newNode.childNodes.item(1).text +
"< /SPAN >< BR >
");
eval(thisMenu + "_Array[j-2] = sMenuItem");
walkTree(newNode);
} else {
sMenuItem = escape("< SPAN id="" + currentMenu + "_span" +
(j-1) + "" class='cellOff' " +
"onMouseOver="stateChange('',this,'');hideDiv(" +
level + ")" onMouseOut="stateChange('',this,'')" " +
"onClick="location.href='" +
newNode.childNodes.item(0).text + "'" >" +
newNode.childNodes.item(1).text +
"< /SPAN >< BR >
");
eval(currentMenu + "_Array[j-2] = sMenuItem");
}
}
arrayNamesArray[arrayNamesArray.length] = currentMenu;
tempString = (unescape(eval(currentMenu + "_Array.join('')")))
arrayHolderArray[arrayHolderArray.length] = tempString
currentMenu = currentMenu.substring(0,currentMenu.length-2);
把此文章收藏到: