简单的树形菜单

菜单

<!---
  简单的树形菜单

  徐祖宁(唠叨)
  2003.03
  czjsz_ah@stats.gov.cn

  树形菜单较滑动菜单稍微复杂一点。其主要难点在于从简洁的数据描述来产生便于操纵的html结构。
  本例用来展示树形菜单的编写。使用无线表格,算法上采用了递归,理论上可构造无穷分制枝的树。
  本代码可自由扩散。
--->
<style>
table {font-size = 9pt}
td {height = 10px}
</style>
<body>
<span id="menus"></span>
<span id="view"></span>
</body>

<script>
/**
* 构造树,初值为0
*/
function tree(n) {
    var id = new Array("bar","pad","#","+");
    if(n == 0) { // 初始化变量
        n = 1;
        i = 0;
        s = "";
    }
    s += "<table>";
    for(;i<tree_ar.length-1;i++) {
        var k = (n >= tree_ar[i+1][0])?0:1;
        s += "<tr id='"+id[k]+"' value="+i+"><td>"+id[k+2]+"</td><td>"+tree_ar[i][1]+"</td></tr>"; // 构造节点,注意这里的自定义属性value。作用是简化构造节点的描述,共享参数数组信息。
        if(n > tree_ar[i+1][0]) { // 若期望层次大于当前层次,结束本层次返回上一层次。
            s += "</td></tr></table>";
            return tree_ar[i+1][0];
        }
        if(n < tree_ar[i+1][0]) { // 若期望层次小于当前层次,递归进入下一层次。
            s += "<tr style='display:none' v=1><td></td><td>";
            var m = tree(tree_ar[++i][0]);
            s += "</td></tr>";
            if(m < n) { // 当递归返回值小于当前层次期望值时,将产生连续的返回动作。
                s += "</table>";
                return m;
            }
        }
    }
    s += "</table>";
    return s;
}
</script>

<script for=pad event=onclick>
// 分枝节点的点击响应
v = this.parentElement.rows[this.rowIndex+1].style;
if(v.display == 'block') {
    v.display = 'none';
    this.cells[0].innerHTML = "+";
    view.innerHTML = ""; // 自行修改为参数数组定义的闭合动作
}else {
    v.display = 'block';
    this.cells[0].innerHTML = "-";
    view.innerHTML = "<b>"+tree_ar[this.value][1]+"</b>"; // 自行修改为参数数组定义的展开动作
}

/**
* 以下代码用于关闭已展开的其他分枝
* 如需自行关闭展开的分枝则从这里直接返回或删去这段代码
*/
if(! tree_ar[this.value].type) // 如该节点为首次进入,则记录所在层次信息
    genTreeInfo(this);
var n = 1*this.value+1;
for(i=n;i<tree_ar.length-1;i++) { // 关闭排列在当前节点之后的树
    if(tree_ar[i].type == "pad") {
        tree_ar[i].obj2.style.display = 'none';
        tree_ar[i].obj1.cells[0].innerHTML = "+";
    }
}
while(tree_ar[--n][0] > 1); // 回溯到当前树的起点
while(--n >= 0) // 关闭排列在当前树的起点之前的树
if(tree_ar[n].type == "pad") {
    tree_ar[n].obj2.style.display = 'none';
    tree_ar[n].obj1.cells[0].innerHTML = "+";
}

/** 记录层次信息,用以简化遍历树时的复杂的节点描述 **/
function genTreeInfo(o) {
  var el = o.parentElement;
  for(var i=0;i<el.rows.length;i++) {
    if(el.rows[i].id != "") {
      tree_ar[el.rows[i].value].type = el.rows[i].id;
    }
    if(el.rows[i].id == "pad") {
      tree_ar[el.rows[i].value].obj1 = el.rows[i];
      tree_ar[el.rows[i].value].obj2 = el.rows[i+1];
    }
  }
}
</script>

<script for=bar event=onclick>
// 无分枝节点的点击响应
view.innerHTML = "<b>"+tree_ar[this.value][1]+"</b>"; // 自行修改为参数数组定义的点击动作
</script>

<script>
/**
* 基本参数数组,根据具体应用自行扩展
* 数据可较简单的由服务器端提供
* 列1:节点层次
* 列2:节点标题
* 其余自行扩充
*/
tree_ar = new Array(
  new Array(1,"节点1"),
  new Array(1,"节点2"),
  new Array(2,"节点3"),
  new Array(2,"节点4"),
  new Array(3,"节点5"),
  new Array(4,"节点6"),
  new Array(5,"节点7"),
  new Array(6,"节点8"),
  new Array(7,"节点9"),
  new Array(2,"节点10"),
  new Array(1,"节点11"),
  new Array(2,"节点12"),
  new Array(2,"节点13"),
  new Array(1,"节点14"),
  new Array(1,"") // 为简化终止判断附加的空数据项
);

/*** 创建菜单 ***/
menus.innerHTML =tree(0);
</script>

时间: 2024-08-30 21:44:12

简单的树形菜单的相关文章

jquery树形菜单效果的简单实例_jquery

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

用dtree实现树形菜单 dtree使用说明_导航菜单

准备工作: 请从http://www.jb51.net/jiaoben/31974.html下载dtree.zip文件 dtree.zip压缩包介绍: dtree是一个由JavaScript编写成的简单的树形菜单组件,目前免费并且开源. 目前有很多的树形菜单组件(比如ext),dtree是一种简单易懂的js组件, 不需要复杂的操作即可生产,同时支持动态从数据库引入数据 解压后有以下几部分: img文件夹: 包含树形菜单显示需要的图标 api.html : 作者写的dtree帮助文档 dtree.

JS+CSS简单树形菜单实现方法_javascript技巧

本文实例讲述了JS+CSS简单树形菜单实现方法.分享给大家供大家参考.具体如下: 这是一款不错的CSS树形菜单,树状列表,当然不全是CSS实现,部分功能还使用了JavaScript代码进行配合,删减了修饰用的菜单图片,大家用的时候自己图片加进去,IMG标签大部分都预留了出来,稍懂Html语法的朋友很容易就看懂的. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-css-simple-tree-menu-style-codes/ 具体代码如下

一个简单的js树形菜单_javascript技巧

我练习一下,以免不时之需. 树形菜单不过就是把普通菜单重新排列一下,看起来像树形而已. 上图京东的菜单,给他多几个嵌套,然后添加收缩伸展事件,差不多就行了. 给个例子: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html>

JavaScript + PHP 应用二:网页设计中树形菜单的动态实现

树形菜单,熟悉Windows程序管理器的读者一定不会陌生.单击项目左侧的+号,项目展开:再次单击,项目收缩.读过很多篇有关树形菜单的JavaScript实现方法,原理很简单,都是利用Style中display属性的控制.笔者本文的重点并不侧重于此,倒是想谈一谈如何实现每一次从数据库中提取数据并动态更新树形菜单. 树形菜单主要用来导航.网站有很多栏目,每个栏目下有很多子栏目,栏目经常变动,如增加新栏目,改变现有栏目名称,调整主次栏目之间关系等等,如果每一次都去改动页面代码,非常不便.而且因为信息都

js Tree - 树形菜单插件

   js Tree - 树形菜单       1)DTree是 JQuery 著名树形插件Dynatree的包装类,增加右键菜单,添加.删除.更新接口. 主页: http://www.boarsoft.com/cn/javascript/dtree/     2)jquery treeList widget这是一个利用jQuery UI Widget Factory创建的轻量级,可换肤树形列表控件. 主页: http://www.jordivila.net/lightweight-treeli

以前写的两个CSS树形菜单_经验交流

第一次写的CSS树形菜单比较简单,只有二级目录,javascript代码总共不到十行,主要是靠CSS中的包含写法来实现的.演示地址:(1)http://www.cnlei.org/mycode/csstreemenu/index.html(2)http://cnlei.iecn.net/mycode/csstreemenu/index.html下载链接:(1)http://www.cnlei.org/mycode/csstreemenu/csstreemenu.rar(2)http://cnle

Bootstrap树形菜单插件TreeView.js使用方法详解_javascript技巧

jQuery多级列表树插件基于Twitter Bootstrap,以简单和优雅的方式来显示一些继承树结构,如视图树.列表树等等. 实用Bootstrap树形菜单特效插件Bootstrap Tree View,非常不错的Bootstrap插件,现在很多Bootstrap制作的页面都需要此功能,此插件需要Bootstrap3版本以及jQuery 2.0极以上版本支持,支持众多参数自定义功能,颜色.背景色.图标.链接等,还是很不错的. 效果图: 具体使用方法: 插件依赖 Bootstrap v3.0.

Vue.js 递归组件实现树形菜单(实例分享)_javascript技巧

最近看了 Vue.js 的递归组件,实现了一个最基本的树形菜单. 项目结构: main.js 作为入口,很简单: import Vue from 'vue' Vue.config.debug = true import main from './components/main.vue' new Vue({ el: '#app', render: h => h(main) }) 它引入了一个组件 main.vue: <template> <div class="tree-m