【JS 设计模式 】用组合模式来实现树形导航--代码结构思路分析(一)

树导航效果图:

组合模式的描述:

将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

我们把部分用Leaf表示, 把整体用Composite表示。组合模式是有一定规律的,在实现树导航的情况下,Composite需要包含一个以上Leaf,也可以包含一个以上Leaf和一个以Composite,为什么说要包含一个以上的,如果Composite不包含任何子child的话那么它就是Leaf,Leaf表示是最后一层结节。

树形导航代码片段:

[data-panel="tree"] .tree-folder, [data-panel="tree"] .tree-only, [data-panel="tree"] .tree-child {
    padding-left: 20px;
}
[data-panel="tree"] .tree-root, [data-panel="tree"] .tree-folder, [data-panel="tree"] .tree-only, [data-panel="tree"] .tree-child {
    position: relative;
}
[data-panel="tree"] .folder {
    display: block;
    position: relative;
    padding: 4px 6px;
    color: #333;
    cursor: pointer;
    overflow: hidden;
}
[data-panel="tree"] b {
    float: left;
    margin-top: 4px;
    background-position: 0 -35px;
    width: 20px;
    height: 16px;
}
[data-panel="tree"] i, [data-panel="tree"] b {
    background-image: url("../image/tree/tree_icon.png");
    background-repeat: no-repeat;
}
[data-panel="tree"] .tree-only > i {
    background-position: 0 -151px;
}
[data-panel="tree"] i {
    position: absolute;
    top: 50%;
    left: 0;
    height: 28px;
    width: 16px;
    margin-top: -14px;
}
[data-panel="tree"] .tree-folder > i {
    background-position: 0 -61px;
    cursor: pointer;
}
[data-panel="tree"] .tree-child:not(:last-child) {
    background-image: url("../image/tree/tree_line.png");
    background-position: 0 0;
    background-repeat: repeat-y;
}
[data-panel="tree"] .tree-folder.last > i {
    background-position: 0 -91px;
}
[data-panel="tree"] .tree-only.last > i {
    background-position: 0 -181px;
}
[data-panel="tree"] .folder.empty {
    color: #999;
}
[data-panel="tree"] .tree-root > .toolbar, [data-panel="tree"] .tree-folder > .toolbar, [data-panel="tree"] .tree-only > .toolbar {
    position: absolute;
    top: 0;
    right: 0;
    display:none;
}
[data-panel="tree"] .tree-root > .toolbar > a, [data-panel="tree"] .tree-folder > .toolbar > a, [data-panel="tree"] .tree-only > .toolbar > a {
    display: inline-block;
    padding: 4px 6px;
    color: #00a0e9;
}
[data-panel="tree"] .tree-root:hover > .folder, [data-panel="tree"] .tree-folder:hover > .folder, [data-panel="tree"] .tree-only:hover > .folder {
    background-color: #fafafa;
}
[data-panel="tree"] .tree-root:hover > .toolbar, [data-panel="tree"] .tree-folder:hover > .toolbar, [data-panel="tree"] .tree-only:hover > .toolbar {
  display: block
}

<div id="groupView" class="groupView panel-body" data-panel="tree">
  <div class="tree-folder last"><b></b><a class="folder" href="/Favorite/index/0" id="0">全部[0]</a></div>
  <div class="tree-child">
    <div class="tree-only"><i></i><a class="folder" href="/Favorite/index/0" id="0">未分组[1]</a></div>
    <div class="tree-folder"><i></i><b></b><a class="folder" href="/Favorite/index/6" id="6">客户[1]</a></div>
    <div class="tree-child">
      <div class="tree-only"><i></i><a class="folder" href="/Favorite/index/8" id="8">西方客户[1]</a></div>
      <div class="tree-only last"><i></i><a class="folder empty" href="/Favorite/index/9" id="9">东方客户[0]</a></div>
    </div>
    <div class="tree-only"><i></i><a class="folder" href="/Favorite/index/13" id="13">修改分组名称[2]</a></div>
    <div class="tree-folder"><i></i><b></b><a class="folder" href="/Favorite/index/16" id="16">计算机[0]</a></div>
    <div class="tree-child">
      <div class="tree-only"><i></i><a class="folder empty" href="/Favorite/index/17" id="17">硬件工程师[0]</a></div>
      <div class="tree-only last"><i></i><a class="folder empty" href="/Favorite/index/18" id="18">软件工程师[0]</a></div>
    </div>
    <div class="tree-only last"><i></i><a class="folder empty" href="/Favorite/index/40" id="40">最新添加[0]</a></div>
  </div>
</div>

tree_icon.png图片地址:http://img.blog.csdn.net/20160424123943829

tree_line.png图片地址:http://img.blog.csdn.net/20160424123959314

分析HTML代码结果

我们从HTML代码中找到一些规律,从图中看几个框框:

第一个红色的内的第一个元素标签div.tree-child, 红框外距离红框最近的一个元素是div.tree-folder.
通过这个红框来看,我们不难分析出粉红框 和黑框内的代码和红框的是相似的。

我们在来看看还有没有其它的规律,
也许你已经看出来了一个了,有的div的class属性值是tree-only而有的是tree-only last,他们的区别是什么呢?
通过下图来看,带圈的是表示是有last选择器的。

通过HTML代码可以看出图片上有四个last选择器,而我们通过这张图片只看出三个。 想知道原因请看下图

原本通过代码看到的应该是这张图片,原因我不希望第一个节点元素显示它前面的那个节点图片,所以我们是通过程序控制掉了它。

我们来看下一张图片,红框里的代码是<b></b>,我们再看一下其它的div.tree-folder元素内的第一个元素怎么是<i></i>呢?第二元素才是<b></b>,原因很简单,<i></i>显示的是节点图片。原因我不希望显示第一个节点图片,所以我们就没有把它添加到DOM元素中.

那么我们再来找下一个规律:我们看一下HTML代码又发现一个那就是div中有带empty的,有的就不带empty,empty是空的意思,在这里说明没有数据。它是在效果中那里体现的呢?请看一下图

大家明白了吗?,这个红框里的代码是带有empty选择器的元素。empty是用来控制是否有数据的样式。这些都是通过js来控制的。

【JS 设计模式 】用组合模式来实现树形导航--JS代码结构思路分析(二)

时间: 2024-10-23 12:14:20

【JS 设计模式 】用组合模式来实现树形导航--代码结构思路分析(一)的相关文章

【JS 设计模式 】用组合模式来实现树形导航--JS代码结构思路分析(二)

[JS 设计模式 ]用组合模式来实现树形导航--代码结构思路分析(一) 根据上一节中的HTML代码结构我们通过JS来渲染HTML代码,我们先提供一下JS的代码片段,这代码代码不是一个完整的代码是经过简化的.通过JS代码来分析如何组装HTML的 Composite类型的代码: function TreeComposite(id, name, total, level, last) { var root = document.createDocumentFragment(); var panel =

设计模式:组合模式(Composite)

将对象组合成属性结构以表示"部分-总体"的层次结构.组合使得用户和单个对象和组合对象的使用具有一致性. 组合模式设计的角色: 1. Component:是组合中的对象声明接口.在适当的情况下.实现全部类共同拥有接口的默认行为.声明一个接口用于訪问和管理Component. 2. Leaf:在组合中表示叶子节点对象.叶子节点没有子节点. 3. Composite:定义树枝节点行为.用来存储子部件.在Component接口中实现与子部件有关操作,如增加和删除等. 举个简单样例(树枝和叶子)

每天一个设计模式之组合模式

作者按:<每天一个设计模式>旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现.诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) 原文地址是:<每天一个设计模式之组合模式> 欢迎关注个人技术博客:godbmw.com.每周 1 篇原创技术分享!开源教程(webpack.设计模式).面试刷题(偏前端).知识整理(每周零碎),欢迎长期关注! 如果您也想进行知识整理 + 搭建功能完善/设计简约/快速启动的个人博客,请直接戳the

设计模式之组合模式(Composite)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

设计模式之组合模式(Composite)

1.定义 组合模式(Composite Pattern)也叫合成模式,将对象组合成树形结构以表示"整体-部分"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 2.通用类图 Component抽象构件角色:定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性. Leaf叶子构件:叶子对象,其下再也没有其他的分支,也就是遍历的最小单位. Composite树枝构件:树枝对象,它的作用是组合树枝节点和叶子节点形成一个树形结构. 3.通用源代码 package Compo

java设计模式之组合模式

树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题,组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形结构或者树形结构的一部分,也可以一致性地处理树形结构中的叶子节点(不包含子节点的节点)和容器节点(包含子节点的节点).下面将学习这种用于处理树形结构的组合模式. 11.1 设计杀毒软件的框架结构 Sunny软件公司欲开发一个杀毒(AntiVirus)软件,该软件既可以对某

c++设计模式15 --组合模式

今天研究了一下设计模式15 组合模式 本人是菜鸟一枚,所以一开始完全不懂组合究竟是什么意思.先上图一张,树形结构图: 文档说,如果想做出这样的结构,通常考虑组合模式.那是为什么呢?现在让我们看一下组合模式的类图一本结构 想了很久,结合源代码,才搞明白,其实这个组合,意思就是说,如果我们要做这种树状结果,比如公司想让我们吧所有部门人员的 姓名,职位,薪水遍历出来,这个时候怎么办呢?那我们看树状机构图,有叶子结点和枝干结点,2种,但是2种有共性,那就是每个结点都有姓名,职位,薪水.所有叶子结点和枝干

设计模式之组合模式(Composite Pattern)

一.什么是组合模式? 组合模式提供了一种层级结构,并允许我们忽略对象与对象集合之间的差别 调用者并不知道手里的东西是一个对象还是一组对象,不过没关系,在组合模式中,调用者本来就不需要知道这些 二.举个例子 假设我们要去描述文件系统,文件系统里有文件和文件夹,文件夹里又有文件夹和文件... 没错,这是一个层级结构,就像菜单一样,菜单里有菜单项和子菜单,子菜单里有菜单项和子子菜单.. 层级结构也就是树形结构,我们很容易想到定义一个Node类,包含一组指向孩子的指针,以此构造一颗完整的树 那么我们的类

C#设计模式:组合模式(Composite Pattern)

一,C#设计模式:组合模式(Composite Pattern) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _9.组合模式 { //组合模式主要用来处理一类具有"容器特征"的对象--即它们在充当对象的同时,又可以作为容器包含其他多个对象. //组合模式,将对象组合成树形结构以表示