尽管我使用 Java 编程已有十年有余,但其实 JavaScript 才是我最早掌握的一门编程语言,虽然 C 语言是大学生的必修课,但我真不敢说在当时我已经掌握了它,在 Web 2.0 的时代,最流行的开发工具便是网页三剑客,Dreamwaver 的所见即所得让很多初学者也能写出一个可以运行的 Web 应用,我便是其中一个。
武功秘籍
刚开始学习 Web 开发时,页面布局基本上都是通过 Dreamwaver 的可视化设计器来完成,如果要实现动态的效果,就得从网上找别人写好的 JavaScript 脚本,对于非科班出身的我来说,虽然大概能看懂代码的逻辑,但完全不知道那段脚本中使用到的属性、方法都是从哪里来的,我怎么知道还有没有别的属性和方法,这一问题困扰了我很久,直到有一天,一位朋友给我一个 CHM 格式的电子文档 ——《HTML编程指南》。
这本《HTML编程指南》对于我来说,简直就是一本武功秘籍,从这里,我终于知道了原来有种东西叫 API 规范,而这份文档中,给出了 HTML 中所有 API 的定义以及如何使用的例子,从这份文档中,我学会了如何通过操作 HTML DOM 结构来实现一些动态的效果,以及如何通过处理事件来实现动态的交互,还有当时 Web 端最流行的技术 —— AJAX(Asynchronous JavaScript and XML) ,在当时那个年代据说会写 AJAX 就能找到一份不错的 Web 开发的工作。
由于 HTML 中只有 DOM Element,并没有完整的树形控件的概念,如果我们要用 DOM 来实现树形控件,就需要使用一系列 DOM 元素来拼装,与其说树形控件是视觉上的树形结构,不如说是逻辑上的树形结构,从 DOM 的角度来说,DOM 节点之间的关系并不等同于树形控件上的节点之间关系,比如:树形控件上的父子节点并不能简单地用一个 DOM 元素嵌套另一个 DOM 元素来实现,因为每个树形节点上除了有标题,还有节点图标(icon)、状态图标(展开或折叠状态)以及子节点等等,所以,仅用一个 DOM 元素是无法表达出这么多信息,需要用多个 DOM 元素来完成一个树形节点的表达,如下图所示:
因此,要实现一个树形控件,就需要将视觉结构和逻辑结构分离,然后通过逻辑结构来组织视觉结构,所谓视觉结构,就是 HTML 中的 DOM 元素,而逻辑结构,就是面向对象编程中的抽象的概念——类(Class), 例如:我们可以使用 TreeView 来表示整个树形控件,用 TreeNode 表示树形结构中的节点,每个节点都有一个父节点和一个子节点的列表,用码则可以这样表示: