一般我们见到的XML文件是以元素为结点的,随着层次的不断加深,逐渐成了一棵树,这种文件的好处是我们一看就很明白其中的子、父、祖宗、兄弟关系,不方便之处在于,我个人认为,如果层次很深又有很多的兄弟结点的话,那么文件可能很大而影响处理的效率。正由于XML对描述数据结构的灵活性,所以在某些环境下采用属性值来描述元素之间的关系。例如花园左边的TOC(TABLE OF CONTENT),实现它的XML文件通过属性值来说明元素的类型(NODE OR LEAF),不过里面仍有子结点存在,所以用来TRANSFORM它的XSL文件很复杂,分了好几种情况。当然今天我们不是谈花园TOC的实现方法而是用一种更快速、更巧妙的方法来实现类似的TOC,当然也可以叫"树形折叠导航栏"。好了,废话少说,进入正题。先来看一个很简单的DTD。 NAVIGATOR.DTD
展开和折叠其实就是显示或不显示(display:none or block)它与可见与不可见(visible or invisible)是有区别的, 前者不在页面预留空间。 这个toggle函数完成两个功能, 改变TR原来的Hidden属性, 使原来不显示的显示; 改变IMG的src属性, 更改图片。
toggle.js
function toggle(id) { var thisRow = document.all.item(id); if (thisRow) { if (thisRow.getAttribute("Expanded") == ''yes'') { thisRow.setAttribute("Expanded", "no"); thisRow.children(0).children(0).children(0).src = "images/bs.gif";
var allRows = document.all.tags("TR"); for (var i=1; i < allRows.length; i++) { var row = allRows[i]; if (row.getAttribute("AncestorID") == id) { if (row.getAttribute("Expanded") == ''yes'') { toggle(row.getAttribute("id")); } row.className = ''Navigator-Hidden''; } } thisRow.className = ''Navigator''; } else { thisRow.setAttribute("Expanded", "yes"); thisRow.children(0).children(0).children(0).src = "images/bo.gif";
var allRows = document.all.tags("TR"); var depth = parseInt(thisRow.getAttribute("Depth")); for (var i=1; i < allRows.length; i++) { var row = allRows[i]; if (row.getAttribute("AncestorID") == id && parseInt(row.getAttribute("Depth")) == depth + 1 ) { row.className = ''Navigator''; } } } } }
查看所有0条评论>>