jQuery Treeview

Treeview(树形视图)把层级数据展示为可展开/折叠的树,常用于文件管理、分类目录、组织架构。核心交互是"点击文件夹节点、切换其子列表的显隐"。本节从零实现该逻辑,并封装成支持选项的 $.fn.treeview 插件,方便复用。

1. 树的 HTML 结构

用嵌套列表表达层级:li 内含标题与子 ul,folder 标记可展开的节点:

<style>
ul.tree, ul.tree ul { list-style: none; padding-left: 18px; }
ul.tree .folder { cursor: pointer; color: #06c; }
</style>
<ul class="tree" id="tree">
  <li><span class="folder">文档</span>
    <ul>
      <li><span class="folder">教程</span>
        <ul>
          <li>jQuery 教程</li>
          <li>HTML 教程</li>
        </ul>
      </li>
      <li>图片</li>
    </ul>
  </li>
  <li>关于我们</li>
</ul>

2. 展开与折叠逻辑

用事件委托绑定:点 folder 时切换其下子 ul 的显隐:

$("#tree").on("click", "span.folder", function () {
  $(this).toggleClass("active")
         .parent().children("ul").stop().slideToggle(200);
});
// 效果:点"文档"展开其下的"教程、图片";点"教程"再展开一层;
// 再点一次已展开的节点,对应子层即收起

3. 封装成 $.fn.treeview 插件

把委托逻辑做成插件,collapsed 选项决定初始状态(标准写法:$.extend 合并选项、return this 支持链式调用):

$.fn.treeview = function (options) {
  options = $.extend({ collapsed: true }, options);
  if (options.collapsed) { this.find("ul").hide(); }   // 初始全部收起
  this.on("click", "span.folder", function () {
    $(this).toggleClass("active")
           .parent().children("ul").stop().slideToggle(200);
  });
  return this;
};
$("#tree").treeview({ collapsed: false });
// 效果:#tree 初始展开第一层(collapsed:false),点击节点仍可逐层收起/展开

4. 数据驱动的动态树

树常由 AJAX 数据生成:递归拼 HTML 后调用 treeview,有 children 的节点渲染成 folder:

var data = [
  { name: "前端", children: [{ name: "jQuery" }, { name: "Vue" }] },
  { name: "后端" }
];
function build(items) {
  return "<ul>" + items.map(function (it) {
    var child = it.children ? build(it.children) : "";
    var cls = child ? " class='folder'" : "";
    return "<li><span" + cls + ">" + it.name + "</span>" + child + "</li>";
  }).join("") + "</ul>";
}
$("#tree2").html(build(data)).treeview();
// 效果:根据 data 自动生成两级树,含子节点的项可展开/折叠

5. 应用与性能提示

  • 事件委托绑定在容器上,动态添加的节点无需重新绑定;
  • 节点多时给 li 加 data-id,点击时读取 id 配合 Ajax 懒加载下一层,避免一次性渲染整棵树;
  • 功能复杂(拖拽、多选、懒加载)可选用 zTree、jstree 等成熟插件,思路与本例一致。

小结

Treeview 的本质是"点击文件夹、slideToggle 其子列表";封装成支持 collapsed 选项的 $.fn.treeview 后即可复用于任意树数据,层级深、节点多时优先事件委托与 Ajax 懒加载。

笔记加载中…