`
pcajax
  • 浏览: 2173945 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

js 树菜单

阅读更多

 
<!doctype html>
<title>树 by 司徒正美</title>
<meta charset="utf-8"/>
<meta name="keywords" content="树 by 司徒正美" />
<meta name="description" content="树 by 司徒正美" />
<h2>树 by 司徒正美</h2>
<script type="text/javascript">
  Tree = function(){
    this.path = "http://images.cnblogs.com/cnblogs_com/rubylouvre/205314/o_";
    this.name = "tree";
    this.id = + new Date + parseInt(Math.random()*100000);
    this.initialize.apply(this, arguments);
  }
  Tree.prototype = {
    constructor : Tree,
    initialize : function(config){
      var me = this, renderTo = config.renderTo;
      me.tree = config.data;
      me.container = ((typeof renderTo === "string") ?
        document.getElementById(renderTo) : renderTo) || document.body;
      me.panel = document.createElement("div");
      me.panel.setAttribute("id","tree" + me.id)
      me.container.insertBefore(me.panel,null);
      var id = "#"+me.panel.id;

      var sheet = document.createElement('style');
      sheet.type = 'text/css';
      document.getElementsByTagName('head')[0].appendChild(sheet);
      var bg = "background:transparent url("+me.path;
      var cssCode = id +" {font-size:12px;}\n" +
        id+" img {border:0;vertical-align: middle;}\n" +
        id+" span {vertical-align: bottom;}\n"+
        id+" .line {padding-left:18px;"+bg+"line.gif) repeat-y 0 0;}\n"+
        id+" .blank {margin-left:18px;}\n"+
        id+" img.collapse {padding-right:18px;"+bg+"folder.gif) no-repeat right center;}\n"+//控制枝节点的装饰图标(闭合)
      id+" img.unfold {padding-right:18px;"+bg+"folderopen.gif) no-repeat right center;}\n"+//控制枝节点的装饰图标(展开)
      id+" img.root {padding-right:18px;"+bg+"root.gif) no-repeat right center;}\n"+ //控制根节点的装饰图标
      id+" img.leaf {padding-right:18px;"+bg+"leaf.gif) no-repeat right center;}\n" //控制叶节点的装饰图标
      if(!+"\v1"){
        sheet.styleSheet.cssText = cssCode
      }else if(/a/[-1]=='a'){
        sheet.innerHTML = cssCode
      }else{
        sheet.appendChild(document.createTextNode(cssCode));
      }

      //添加根节点
      var icon = me.makeImage("nolines_plus","collapse root")
      var checkbox0 = me.makeImage("checkbox_0","checkbox_0");
      me.panel.innerHTML = me.makeTree(me.tree[0][0],"b",0,icon+checkbox0, me.tree[0][2]);
      me.childs = [];
      me.checks = [];//由来装载点击数
      me.panel.onclick = function(e){
        e = e || window.event;
        var node = e.srcElement ? e.srcElement : e.target;
        var current = node.parentNode;
        var currentIndex = current.getAttribute("index");
        var currentPrefix = current.getAttribute("prefix");
        var currentLevel = current.getAttribute("level");
        var subtree = me.getSubtree(currentIndex);
        var children = current.children[3];
        //添加子树集合
        //存在子树并且没有添加时才添加
        if(subtree && !children){
          children = document.createElement("div");
          var childs = [];
          for(var i=0,length = subtree.length;i<length;i++){
            var isLimb = me.hasSubtree(subtree[i][0]);
            var isLast = (i == subtree.length - 1);
            var prefix = isLast ? "blank" : "line";
            icon = isLast ? "plusbottom" : "plus";
            if(isLimb){
              icon = me.makeImage(icon,"collapse limb");//枝节点前面的装饰图标
            }else{
              icon = icon.replace(/plus/, "join");//叶子节点前面的连线图标
              icon = me.makeImage(icon,"leaf");//叶子节点前面的装饰图标
            }
            childs.push(subtree[i][0])
            children.innerHTML += me.makeTree(subtree[i][0],prefix,+currentLevel+1,icon+checkbox0,subtree[i][2])
          }
          me.childs[currentIndex] = childs;
          children.className = (currentPrefix == "line") ? "line": "blank";
          current.insertBefore(children,null);
        }

        if(/collapse/.test(node.className)){//如果点击是加号或减号图标
          node.src = node.src.replace(/plus/,"minus");//改变连线图标
          node.className = node.className.replace("collapse","unfold");//改变装饰图标
          children &&(children.style.display = "block");
        }else if(/unfold/.test(node.className)){
          node.src = node.src.replace(/minus/,"plus");//改变连线图标
          node.className = node.className.replace("unfold","collapse");//改变装饰图标
          children &&(children.style.display = "none");
        }

        if(/checkbox/.test(node.className)){//如果单击的是checkbox图标
          var checked = me.isChecked(node);//如果是true则--,如果是false则++
          me.setPriorCheckbox(current,checked);//一开始肯定是checkbox,返回false
          me.setJuniorCheckbox(current,checked)
        }
      }
    },
    setJuniorCheckbox : function(node,/*Boolean*/checked){
      var checkbox = node.children[1];
      var replaceCheckbox = checked ? "checkbox_0" :"checkbox_1";
      checkbox.src = checkbox.src.replace(/checkbox_\d/,replaceCheckbox);
      checkbox.className  = replaceCheckbox;
      var index = node.getAttribute("index");
      if(!!this.childs[index]){
        var length = this.childs[index].length;
        this.checks[index] = checked ? length : 0;
        if(length > 0){
          var children = node.children[3].children;
          while(--length >= 0){
            this.setJuniorCheckbox(children[length],checked)
          }
        }
      }
    },
    setPriorCheckbox :function(node,/*Boolean*/checked){//设置上一级树的checkbox
      var index = node.getAttribute("index");
      var prior = node.parentNode.parentNode;
      var priorIndex = this.tree[index][1];
      var priorCheckbox = prior.children[1];
      var priorLevel = prior.getAttribute("level");
      var priorCount = this.checks[priorIndex] || 0;
      checked ? priorCount-- : priorCount++;
      (priorCount < 0) && (priorCount = 0)
      this.checks[priorIndex] = priorCount;
      if(!!priorCheckbox){
        //当priorIndex等于-1时,
        //priorCheckbox不存在
        //me.childs[priorIndex]为undefined,不存在长度
        checked = (priorCount == this.childs[priorIndex].length);
        var replaceCheckbox = checked ? "checkbox_1" : "checkbox_2";
        //checkbox_1为全选,checkbox_2为非全选
        //全选,则让上级++,即让checked为false
        priorCheckbox.src =  priorCheckbox.src.replace(/checkbox_\d/,replaceCheckbox);//????????
        priorCheckbox.className  = replaceCheckbox;
      }
      if(priorLevel > 0){ //根节点没有priorCheckbox,且priorLevel等于-1
        this.setPriorCheckbox(prior,checked);
      }
    },
    isChecked : function(node){//如果是checkbox_0返回false,checkbox_1与checkbox_2返回true
      return node.src.slice(-5,-4) > 0;
    },
    makeImage : function(image){
      var status ="";
      if(arguments[1] != null){
        status = "class='" + arguments[1] +"'";
      }
      return "<img src='"+this.path+image+".gif' "+status+" />"
    },

    makeTree : function(index,prefix,level,images,text){
      var builder = [];
      builder.push("<div index='");
      builder.push(index);
      builder.push("' prefix='")
      builder.push(prefix);
      builder.push("' level='")
      builder.push(level);
      builder.push("'>");
      builder.push(images);
      builder.push("<span>");
      builder.push(text);
      builder.push("</span></div>")
      return builder.join('');
    },
    hasSubtree : function (p){
      var tree = this.tree;
      for(var i = 0,length = tree.length;i < length; i++){
        if(this.tree[i][1] == p){
          return true;
        };
      };
      return false;
    },
    getSubtree : function (p){
      var subtree = [],tree = this.tree;
      for(var i = 0,length = tree.length;i < length; i++){
        if(tree[i][1] == p){
          subtree.push(tree[i]);
        };
      };
      return subtree
    }
  }

  var data = [
    [0,-1,"前台技术"],
    [1,0,"表现层"],
    [2,1,"CSS"],
    [3,2,"CSS资源"],
    [4,2,"CSS3前瞻"],
    [5,1,"web标准知识"],
    [6,1,"图形"],
    [7,6,"SVG"],
    [8,6,"VML"],
    [9,6,"canvas"],
    [10,0,"结构层"],
    [11,10,"HTML"],
    [12,10,"微格式"],
    [13,10,"XML"],
    [14,13,"XPath"],
    [15,0,"行为层"],
    [16,15,"core"],
    [17,16,"变量与参数"],
    [18,16,"对象与继承"],
    [19,16,"函数与闭包"],
    [20,16,"算法"],
    [21,16,"高级技术"],
    [22,21,"跨域请求"],
    [23,21,"提速技术"],
    [24,21,"本地存储"],
    [25,21,"函数劫持"],
    [26,16,"框架设计"],
    [27,26,"Ext"],
    [28,26,"dojo"],
    [29,26,"mootools"],
    [30,15,"Ajax"],
    [31,15,"DOM"],
    [32,15,"BOM"]
  ]

  window.onload = function(){
    var tree = new Tree({renderTo:"test",data:data});
  }

</script>
<div id="test"></div>

分享到:
评论

相关推荐

    Ztree各种样式的js树菜单,超好用!(看评论酌情下载)

    这款js树菜单库提供了多种样式,能满足不同设计需求,无论是在后台管理系统还是在数据分类展示上都能发挥出其优势。 在Ztree中,树形菜单的基本结构由节点组成,每个节点可以包含文本、图标以及子节点等信息。通过...

    JS 树菜单集合(最全)

    "JS 树菜单集合(最全)"是针对这一需求提供的资源包,包含多种类型的树菜单实现,适用于不同的场景和设计要求。 树菜单在JS中通常通过DOM操作和事件监听来构建,它们的核心原理是递归地生成和管理节点。"jstree....

    js树菜单源代码集合

    "js树菜单源代码集合"是一个汇集了多种JavaScript实现的树形菜单的资源包,提供了丰富的示例和代码片段,对于开发者来说是学习和借鉴的好材料。 这个压缩包中可能包含了各种不同风格和功能的树菜单实现,如静态树...

    javascript制作 树形菜单.zip

    在JavaScript编程中,树形菜单是一种常见的用户界面元素,它以层级结构展示数据,通常用于网站导航、文件系统浏览或数据库记录的展示。本压缩包包含两个文件:"可以拖动的IEtree树型.htm" 和 "树型结构_lj不错.htm"...

    JS树菜单

    JS树菜单利用JavaScript语言动态构建和操作DOM元素,实现节点的展开、折叠、选择、搜索等功能,为用户提供了直观且易于操作的界面。 ### 一、基本概念 1. **DOM(Document Object Model)**: DOM是HTML和XML文档的...

    (推荐)超级漂亮的JS树形菜单

    在标签中,“JS树形菜单”、“JavaScript树形菜单”和“树形菜单”都是对这个技术的关键词描述,强调其基于JavaScript的实现。JavaScript作为客户端脚本语言,使得树形菜单能够在用户的浏览器端动态生成和操作,无需...

    js树形菜单加右键菜单

    在"js树形菜单加右键菜单"这个项目中,我们可以看到两个关键组件的结合。代码文件`code.htm`很可能是实现这一功能的HTML页面,它可能包含了树形菜单的基本结构和右键菜单的触发器。CSS文件`css`则负责定义样式,包括...

    好看实用js树形菜单

    以下是一个简单的JavaScript树形菜单的实现示例: ```javascript function renderMenu(data, parentEl) { for (let item of data) { let li = document.createElement('li'); let a = document.createElement('a...

    javascript 树形菜单

    总的来说,构建JavaScript树形菜单涉及的技术包括HTML结构设计、CSS样式控制、JavaScript DOM操作、事件处理、数据结构和算法(如遍历树形结构)、以及可能的异步加载和动画效果。通过这些技术的组合,我们可以创建...

    带复选框JS树 Javascript树 JS树 树形菜单

    JavaScript树形菜单是一种在网页中实现层次结构数据展示的交互方式,它通常用于导航、文件管理、选项配置等场景。"带复选框"的JS树形菜单则更进一步,允许用户通过勾选复选框来选择或操作树节点,为用户提供了一种...

    JS无限级树形菜单

    JS无限级树形菜单3种

    js树菜单,日期选择器

    在JavaScript(JS)开发中,树菜单和日期选择器是两个常见的UI组件,它们用于增强用户界面的交互性和功能性。本文将深入探讨这两个组件的工作原理、实现方式以及如何在实际项目中应用它们。 首先,我们来看树菜单。...

    js树形菜单

    "js树形菜单"是使用JavaScript编程语言来实现这种功能的技术。JavaScript作为一种强大的客户端脚本语言,能够在用户与网页之间提供实时的交互,使得树形菜单不仅具有视觉吸引力,而且操作起来非常直观。 实现js树形...

    JS树形菜单源代码下载

    JS树形菜单源代码下载,JS树形菜单源代码下载JS树形菜单源代码下载JS树形菜单源代码下载JS树形菜单源代码下载JS树形菜单源代码下载JS树形菜单源代码下载JS树形菜单源代码下载JS树形菜单源代码下载JS树形菜单源代码...

    JS树形菜单集合(最全)

    JavaScript(简称JS)是一种轻量级的脚本语言,广泛应用于网页和网络应用开发,而树形菜单在前端UI设计中扮演着重要角色,尤其在数据层级结构展示时。JS树形菜单允许用户以交互方式浏览多级数据,提供了一种高效、...

    原生JS无限级树形菜单(兼容各浏览器)

    可动态添加/删除节点,启用/不启用复选框,启用连线或不连线,支持自定义ICON图标,可获取当前选中节点参数及父级目录树,可用作级联下拉树菜单等。 可获取HTML中li列表自动生成树菜单(可用作网站多级分类目录) ...

    js 树形菜单

    "js树形菜单"就是利用JavaScript技术来创建这种具有多级层次的菜单系统。 树形菜单的核心在于递归和事件处理。在JS中,我们可以使用数组或对象来表示树节点的数据结构,每一层节点都是上一层节点的子节点。例如: ...

    javascript树形菜单

    javascript树形菜单

    一个js树形菜单

    综上所述,"一个js树形菜单"项目是一个学习和实践JavaScript核心技能的好例子,它涵盖了数据结构、DOM操作、事件处理、CSS样式等多个方面,对提升Web开发能力大有裨益。通过研究项目中的代码和实现方式,开发者不仅...

Global site tag (gtag.js) - Google Analytics