从头开始学习 Dojo,第 3 部分 利用 Dijit 组件框架打造丰富的用户界面

认识Dojo中的界面控件:Dijit <br />Dojo框架区别于其他Ajax框架的一个显著特征就是它的界面控件系统:Dijit。Dijit是Dojo中界面控件的总称,他们使用灵活而且易于理解。每个Dijit控件都是由Dojo类以及控件中使用的图片,CSS等资源文件共同组成。通过Dijit架构,可以方便的创建灵活、可扩展、可定制外观的控件。下面将逐步介绍如何创建、配置Dijit控件,从而将其用在自己的web应用中。<br /><br /> 开始使用Dijit:引入需要的类和资源<br /> <br />前面提到Dijit的组成中除了Dojo类 阅读详情

Dijit 是什么?

Dijit 是 Dojo 工具包的富组件用户界面库。这些组件完全可以主题化,并且可以通过两种方式声明:可以使用 HTML 风格的标签以声明式方法声明,也可利用 JavaScript 以编程方式声明。这一部分将简要介绍 Dijit,介绍它提供的组件,并描述开箱即用的各种主题。

丰富的用户界面组件

Dijit 的主要特性就是它提供的丰富的用户界面组件套件。大多数 Web 应用程序开发人员都熟知基本 HTML 元素和表单元素的局限性,以及利用 <div> 等元素和 CSS 规则对应用程序进行布局的难度。这正是 Dijit 能够发挥其作用的场所。Dijit 提供了一系列在 HTML 中不可用的组件(当然,在无需您自行编写的情况下),其中包括:

  • 日历
  • 调色板
  • 对话框(模态(modal)或非模态)
  • 富文本编辑器
  • 内嵌编辑器
  • 菜单栏和上下文菜单
  • 进度条
  • 折叠菜单和面板
  • 工具栏
  • 工具提示
  • 树

除了上述列表之外,DojoX 扩展库还提供了一系列额外的组件,包括网格、图表、视频播放器、灯箱效果等。图 1 提供了多种 Dijit 组件的示例,包括按钮、对话框、选项卡容器、日历、调色板、菜单、富文本编辑器和进度条。

图 1. Dijit 组件的实际效果

包含 3 个选项卡、一个调色板、一个文本编辑部分和一个日历的数字窗口。

除了 UI 组件之外,Dijit 还提供了一系列经过改进的表单字段,这提供了比常规 HTML 表单元素更多的灵活性和功能。这些表单控件包括:

  • 特定数据格式的各种文本框控件,包括币种、日期、数字和时间
  • 数字微调钮
  • 自动展开的文本区域
  • 自动完成的组合框
  • 多选列表框
  • 带有下拉菜单的按钮
  • 切换按钮(切换开关)
  • 滑块

图 2 展示了部分此类表单控件的实际效果。

图 2. Dijiti 表单控件的实际效果

包含一个日历、滑块栏、单选按钮和复选框的注册表单。

Dijit 还包括多种布局组件,使您能够轻而易举地组织 Web 应用程序的布局。您不必再为表格或 CSS 浮动内容而烦恼,Dijit 允许您为应用程序布局定义复杂的结构。Dijit 提供的布局组件包括:

  • 折叠容器
  • 堆叠容器
  • 边框容器
  • 选项卡容器
  • 内容窗格

如您所见,Dijit 拥有丰富的用户界面组件,如果开发人员希望能够自行编写这类组件,则需要花费漫长的时间。利用 Dijit,您就可以缩短应用程序的开发时间,因为您不必再为设计或开发复杂的用户界面组件而烦恼。

主题

在上一节中,您看到了 Dijit 用户界面组件的部分示例,所有这些示例均使用了 Dijit 附带的 “Claro” 主题。Dijit 还开箱即用地提供了其他几种主题,使您能够更好地将 Dijit 组件的样式与应用程序的风格相匹配。图 3 展示了其他 Dijit 主题的一些实际效果示例。

图 3. Tundra、Soria 和 ihilo 主题

使用三个面板的相同 Dijit 窗口,分别使用略有不同的样式。

如果 Dijit 包含的主题不适合您的应用程序,那么您可以轻松定义自己的主题,并自定义所有 Dijit 组件,以便确切地满足您的需求。Dijit 主题的创建值得用单独一篇文章加以介绍,Dojo 工具包文档中提供了大量的细节。参考资料 部分提供了 Dojo 文档主题部分的链接。

初识 Dijit

要创建 Dijit 应用程序,则需要包含 Dojo 库本身、您正在使用的主题的 CSS 文件,以及对您的 HTML 文档的 body 元素中的主题选择的引用。随后,还要使用 dojo.require 函数加载您要包含在应用程序之中的 Dijit 组件。

让我们首先从用于使用 Claro 主题的 Dijit 应用程序的一个基本模板开始。出于本文的目的,我将假设您正在从 Google Content Delivery Network (CDN) 加载 Dojo,而不是从您自己的服务器或计算机加载。打开您喜爱的文本编辑器,将清单 1 的内容添加到编辑器之中。

清单 1. 基本 Dijit 模板

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<!doctype html>

<html lang="en" dir="ltr">

    <head>

        <title>Dijit Template</title>

        <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs

/dojo/1.5/dijit/themes/claro/claro.css" />

        <style type="text/css">

            body, html { font-family:helvetica,arial,sans-serif; font-size:90%; }

        </style>

    </head>

    <body class="claro">

        <!-- HTML content here -->

        <script src="https://ajax.googleapis.com/ajax/libs/dojo/1.5/dojo/dojo.xd.js"

djConfig="parseOnLoad: true"></script>

        <script>

            dojo.require("dijit.dijit");

            //Add Dijit components you are using here using dojo.require

     

            dojo.addOnLoad(function() {    

                //JavaScript content here

            });

        </script>

    </body>

</html>

如您在清单 1 中所见,这里加载了来自 Google CDN 的 claro.css 样式表。此外,还有必要为您的 <body> 元素提供一个与正在使用的主题名称相匹配的类名称。在本例中,我正在使用 Claro 主题,因此提供了类名称 claro。您可能会认为,要包含 Dijit,除了基本 Dojo 工具包之外,您还需要包含一系列的 JavaScript 文件。事实上并非如此;您可以使用 Dojo 的加载系统,使用 dojo.require 动态加载您需要的 Dijit 框架元素。然而,我添加的一项内容就是加载 Dojo 的 <script> 标签的 djConfig="parseOnLoad: true" 属性。这会大致告诉 Dojo 它要使用 HTML 解析器,并寻找带有 dojoType 属性的 HTML 元素。下一节将介绍更多相关内容。最后,在主应用程序脚本中,我为 "dijit.dijit" 添加了一个 dojo.require 声明,优化 Dijit 的加载。定义了模板之后,您就可以在应用程序内使用 Dijit 组件了。

在您的应用程序中使用 Dijit 组件的方法共有两种。第一种方法是以声明的方式添加组件。这也就是说,添加到使用 dojoType 属性的页面 HTML 元素,表明一个组件应通过 Dojo 进行解析,然后作为 Dijit 组件呈现。下一节将介绍更多相关内容。添加组件的另外一种方法是使用 JavaScript,以编程的方式定义您的组件。稍后您会看到更多的相关内容。

以声明的方式使用 Dijit

Dijit 所提供的一种其他大多数主流 JavaScript 组件库不具备的非常有用的特性就是:以声明式的方式使用 widget 的方法,换句话说,就是使用常规 HTML 元素。这种方式的一种明显的优势就是允许您使用 HTML 语法设计您的应用程序,就像在 Web 应用程序中一样,将应用程序逻辑独立放置在 JavaScript 之中。

通过这种方法使用 Dijit 非常直观。让我们来看一个创建日历组件的示例。首先,在模板的 <body> 部分中,找到注释 <!-- HTML content here -->,随后使用以下代码行替换此注释:<div dojoType="dijit._Calendar"></div>。

接下来,在 dojo.require("dijit.dijit"); 代码行下,添加以下代码行:dojo.require("dijit._Calendar");。

请保存此文件,并将它载入您喜爱的 Web 浏览器。您应看到类似于图 4 所示的屏幕快照,非常整洁,不是吗?

图 4. Dijit 日历组件实际效果

显示 2010 年 11 月日历的 Dijit 窗口。

通过这种方式声明 Dijit 组件目前是将 Dojo 添加到您的应用程序之中的最便捷的方法。如果适用,您可以在其他 widget 内添加 widget(举例来说,您可以在一个 TitlePane 内添加一个调色板),甚至可以轻而易举地将事件处理程序连接到您的组件。

首先,让我们在一个 widget 内嵌套另一个 widget,如上一节所述。使用清单 2 所示的代码片段取代 HTML 部分中的日历行。

清单 2. 在一个标题窗格内添加调色板的代码片段

1

2

3

<div dojoType="dijit.TitlePane" title="Color Picker">

    <div dojoType="dijit.ColorPalette"></div>

</div>

接下来,使用清单 3 中的代码取代日历的 dojo.require 调用。

清单 3. 更换日历的 dojo.require 调用

1

dojo.require("dijit.TitlePane"); dojo.require("dijit.ColorPalette");

请保存文件,重载 Web 浏览器。您将看到如图 5 所示的效果。

图 5. 位于一个标题窗格内的调色板

位于一个标题窗格内的调色板。

您可以看到,调色板出现在标题窗格组件中,如果您折叠标题窗格,则不会显示调色板。现在,让我们通过两种方法为调色板添加一个事件处理程序。首先,使用内置的 onClick 属性,在用户选择一种颜色时显示包含选定值的警告窗口。为此,请将您的 dojo.ColorPalette 对象的 HTML 元素更改为:<div dojoType="dijit.ColorPalette" onChange="alert(this.value);"></div>。

请保存文件,并将它载入浏览器,随后尝试单击一种颜色。此时应该看到一个警告窗口,其中显示了您选定的颜色的十六进制值。内嵌的事件处理程序非常适合单行操作,但如果您希望执行一些更为复杂的操作,那么这种方法就不太适用。幸运的是,您可以声明 dojo/method<script> 块,将 JavaScript 代码添加到您的 Dijit 组件。

使用清单 4 中的代码,取代您刚刚更改的代码行。

清单 4. Dojo 方法 <脚本> 块实际效果

1

2

3

4

5

<div dojoType="dijit.ColorPalette">

    <script type="dojo/method" event="onChange" args="evt">

         alert(this.value);

    </script>

</div>

请保存文件,重载浏览器,您将看到它执行了相同的操作。然而,这一次,您在 Dijit 组件的 HTML 元素内添加了一个 <script> 块。这里并没有采用传统的 “文本/Javascript” 类型值,而是为其提供了一个 dojo/method 值,告知 Dojo 解析器来解析这个代码块。它利用事件属性,定义应将此代码绑定到哪个事件,并使用 args 属性将所有参数传递给函数。

声明式语法是我个人最喜爱的 Dojo 特性之一,它使得搭建相对复杂的应用程序设计变得极为简单。此外,它还为不熟悉 JavaScript 的人员提供了一种开发复杂 Web 应用程序的方法。在下一节中,您将看到如何利用 JavaScript 来执行这些任务。

利用 JavaScript 处理 Dijit

尽管使用编程的方法不像通过声明式方法使用 Dijit 一样简单,但通过编程式方法添加组件也并不是很难。首先,让我们创建一个基本日历示例,就像上一节所创建的那个示例一样。从基本 Dijit 模板入手(清单 1),在主 HTML 部分中添加以下代码行(取代注释 <!-- HTML content here -->):<div id="myCalendar"></div>。

接下来,在 dojo.require("dijit.dijit"); 代码行下,添加以下代码:dojo.require("dijit.Calendar");。

最后,在 dojo.addOnLoad 功能模块内,添加以下代码行:var calendar = new dijit.Calendar({}, "myCalendar");。

请保存文件,并将它载入您的浏览器。您应看到与图 4 中所见日历相同的日历。在本例中,您为 HTML 代码添加了一个基本占位符元素,其 ID 为 myCalendar。随后,您使用表达式 new dijit.Calendar 以编程的方式创建了日历。此函数的第一个参数是一个配置对象(本例中为空)。第二个参数是应将组件绑定到的 HTML 元素的 ID,在本例中是 myCalendar。非常简单,不是吗?

嵌套组件又如何?让我们继续我们的工作,编写在标题窗格内有一个调色板的示例代码。首先,HTML 部分应包含以下内容:<div id="myTitlePane"></div>。

接下来,您需要清单 5 中的以下 dojo.require 语句(当然,也需要 dijit.dijit)。

清单 5. dojo.require 语句

1

2

dojo.require("dijit.TitlePane");

dojo.require("dijit.ColorPalette");

最后,应将清单 6 中的代码置于 dojo.addOnLoad 块中。

清单 6. 以编程的方式创建标题窗格和调色板

1

2

3

4

5

var colorPalette = new dijit.ColorPalette({});

var titlePane = new dijit.TitlePane({

    content: colorPalette,

    title: "Color Picker"

}, "myTitlePane");

请保存文件并将它载入浏览器,您将得到如 图 5 所示的结果。在观察编程式 Dijit 组件内的事件处理之前,让我们先来看看编写上述代码的替代方法。我们使用了清单 7 中所示的代码来取代 HTML 块。

清单 7. 使用嵌套式 HTML 元素来设定组件布局

1

2

3

<div id="myTitlePane">

    <div id="myColorPalette"></div>

</div>

dojo.addOnLoad 块应包含清单 8 所示的代码。

清单 8. 仅使用 ID 绑定嵌套式组件

1

2

3

4

var colorPalette = new dijit.ColorPalette({}, "myColorPalette");

var titlePane = new dijit.TitlePane({

    title: "Color Picker"

}, "myTitlePane");

在这个版本中,您使用所绑定的 HTML 元素添加了标题窗格内的调色板。在 JavaScript 中,随后会使用 ID 绑定组件,这意味着不必使用内容属性将调色板添加到标题窗格之中。我倾向于使用这种方法,因为 HTML 结构为页面提供了更多语义含义,使您能够更加轻松地通过 HTML 语法观察页面布局。

最后,让我们来看看如何为通过编程的方式声明的 Dijit 组件添加事件处理。使用清单 9 中的代码取代 var colorPalette = new dijit.ColorPalette({}, "myColorPalette"); 代码行。

清单 9. 为以编程的方式创建的组件添加事件处理程序

1

2

3

4

5

var colorPalette = new dijit.ColorPalette({

    onChange: function(evt) {

        alert(this.value);

    }

}, "myColorPalette");

请保存文件,重载浏览器,并单击一种颜色,您会瞬间看到所选定颜色的十六进制值。此外,也可以将代码行保持原样,并在其下方添加如清单 10 所示的代码。

清单 10. 使用 dojo.connect 添加事件处理程序

1

2

3

dojo.connect(colorPalette, "onChange", null, function(evt) {

    alert(this.value);

});

有必要指出的是,在 Dijit 组件中,事件的名称是区分大小写的。Dojo 对常规 DOM 对象中的事件完全使用小写字母,对 Dijit 组件中的事件使用驼峰式大小写(驼峰式大小写即第一个字母采用小写,其他任何后接的词均首字母大写),因此在处理 Dijit 组件时,请务必使用后一种方法。

使用 dijit.byId

如果您阅读了本系列的第一篇 从头开始学习 Dojo,第 1 部分:开始 Dojo 开发,那么应该已经熟悉了 dojo.byId 函数,它能获取对一个 DOM 元素的引用。类似地,Dojo 提供了一个 dijit.byId 函数,允许您获得 Dijit 组件的一个句柄。如果您正在以声明的方式创建组件,并且希望在 JavaScript 代码中与其交互,那么这种方式尤为有用。让我们来看一个例子。

以基本 Dijit 模板(清单 1)为基础,在 HTML 部分中添加以下代码:<button id="myButton" dojoType="dijit.form.Button">Push Me</button>。

接下来,在您的 dojo.require 部分中,请添加如清单 11 所示的代码行。

清单 11. 使用 dojo-require

1

2

dojo.require("dijit.form.Button");

dojo.require("dijit.Dialog");

最后,让我们使用 dijit.byId 获得按钮的一个引用,并在用户单击按钮时显示一个对话框。将清单 12 中的代码添加到 dojo.addOnLoad 函数块中。

清单 12. 使用 dijit.byId 连接到一个按钮

1

2

3

4

5

6

7

var button = dijit.byId("myButton");

dojo.connect(button, "onClick", null, function(evt) {

    var dialog = new dijit.Dialog({

        content: "You clicked the button!",

        title: "Message"

    }).show();

});

请保存文件,并在您的浏览器中打开它。然后单击按钮,您会看到一个对话框,如图 6 所示。

图 6. 按钮和对话框

显示消息 ‘您单击了按钮’ 的对话框。

使用 Dijit 的布局特性

除了一些非常有用的组件和表单控件之外,Dijit 还提供了一个出色的布局框架,使您能够更加轻松地组织应用程序的界面。这一节将介绍如何使用 Dijit 的各种布局组件。为了简便起见,所有示例均使用 Dojo 的声明式语法提供,但是,如有必要,您应该可以能够很轻松地将其转为编程式方法。

内容窗格(panes)

内容窗格是最基本的 Dijit 布局组件。它们允许您定义一个内容部分,通过直接将 HTML 代码提供给内容属性来载入这一部分,或者通过 XmlHttpRequest 调用异步载入它。就后者而言,在从服务器载入内容时,内容窗格会显示一条正在加载的消息。

让我们来看一个非常基础的内容窗格实例。首先,创建一个新文件,将其命名为 content.html,然后为其添加以下代码:<h1>content.html content here!</h1>。

现在,在基本 Dijit 模板中(如 清单 1 所示),将清单 13 中的代码添加到模板的 HTML 部分。

清单 13. 使用 Dijit 内容窗格

1

2

3

4

5

6

<button dojoType="dijit.form.Button" id="myButton">

    Load content using XHR

</button>

<div dojoType="dijit.layout.ContentPane" id="myContentPane">

    <h1>Static content here!</h1>

</div>

接下来,将清单 14 中的代码添加到 dojo.require 部分

清单 14. 将内容窗格添加到 dojo.require 部分

1

2

dojo.require("dijit.form.Button");

dojo.require("dijit.layout.ContentPane");

最后,连接按钮和内容窗格,将 content.html 载入内容窗格。在 dojo.addOnLoad 内添加清单 15 的代码。

清单 15. 将按钮连接到内容窗格

1

2

3

4

5

6

var button = dijit.byId("myButton");

var contentPane = dijit.byId("myContentPane");

 

dojo.connect(button, "onClick", null, function(evt) {

    contentPane.attr("href","content.html");

});

请保存文件,并将它载入您的 Web 浏览器。您会看到如图 7 所示的消息。

图 7. 通过 XHR 加载之前

包含使用 XHR 加载内容按钮和 “Static content here” 这句话的窗口。

现在,请单击按钮,消息将会发生变化。

图 8. 通过 XHR 加载之后

包含使用 XHR 加载内容按钮和 “content.html content here” 这句话的窗口。

不可否认,这个示例非常简单,但它应该能够展示将动态内容载入一个 Dijit ContentPane 组件是多么轻松。Dialog 等其他 Dijit 组件中实际上也使用了这个组件,用它来呈现内容部分。这些组件往往还用于布局容器之中,例如堆叠容器和选项卡容器,稍后我们将介绍相关内容。

堆叠容器

堆叠容器就是允许使用包含多个不同的子容器的容器,但每次仅有一个子容器可见(有时称之为卡片式布局)。如果您正在创建分步向导,那么这种布局组件尤为有用。让我们来看看如何创建 Dijit 堆叠容器,并通过一个堆叠控制器在堆叠的控制器之间进行导航。

首先,通过基本 Dijit 模板(清单 1)创建一个新文件。在 HTML 代码部分中,添加清单 16 所示的代码。

清单 16. 创建一个堆叠容器和控制器

1

2

3

4

5

6

7

8

9

10

<div dojoType="dijit.layout.StackContainer" id="stackContainer">

    <div dojoType="dijit.layout.ContentPane" title="Stack 1">

        This is the content in stack 1.

    </div>

    <div dojoType="dijit.layout.ContentPane" title="Stack 2">

        This is the content in stack 2.

    </div>

</div>

<div dojoType="dijit.layout.StackController"

containerId="stackContainer"></div>

在保存该文件之前,请务必确保它包含所需的必要 dojo.require 调用(请参见清单 17)。

清单 17. 向 dojo.require 添加堆叠容器和控制器

1

2

3

dojo.require("dijit.layout.StackContainer");

dojo.require("dijit.layout.StackController");

dojo.require("dijit.layout.ContentPane");

请保存文件,并将它载入您的浏览器。您应该看到如图 9 所示的结果。单击控制器按钮会允许您更改当前选定的堆叠。所有这一切均无需使用 JavaScript(当然,dojo.require 调用除外),这真是令人满意,不是吗?

图 9. 堆叠容器和堆叠控制器实例

屏幕上的两个按钮,一个显示为 Stack 1,另一个显示为 Stack 2。

选项卡容器

与堆叠容器相似,选项卡容器允许您拥有多个视图,而任意给定时间仅有一个视图可见。然而,与堆叠容器不同的是,选项卡容器提供了一些选项,这些选项以显示在内容上方、下方或旁边的选项卡的形式出现,可在各视图之间切换。除此之外,它们不需要任何独立控件,因为它们直接构建在组件本身之内。与前面一样,您可以将清单 18 所示的代码添加到代码的 HTML 部分中。

清单 18. 创建一个选项卡容器

1

2

3

4

5

6

7

8

9

10

<div style="width: 535px; height: 290px">

    <div dojoType="dijit.layout.TabContainer" style="width: 100%; height: 100%;">

        <div dojoType="dijit.layout.ContentPane" title="Tab 1">

            This is the content in tab 1.

        </div>

        <div dojoType="dijit.layout.ContentPane" title="Tab 2">

            This is the content in tab 2.

        </div>

    </div>

</div>

在本例中,选项卡容器包含于一个外部 <div> 容器之中,该容器定义了可以包含选项卡容器的区域。当然,不要忘记将相关的代码行添加到您的 dojo.require 块中(请参见清单 19)。

清单 19. 将选项卡容器添加到 dojo.require

1

2

dojo.require("dijit.layout.TabContainer");

dojo.require("dijit.layout.ContentPane");

请保存文件,并将它载入您的浏览器,结果应如图 10 所示。您可以单击相关选项卡,在不同视图之间进行切换。

图 10. 选项卡容器实例

显示两个选项卡的窗口:Tab 1 和 Tab 2

折叠容器

另外一种允许您每次显示一个部分的容器就是折叠容器。这种容器通常采用垂直展开/折叠的布局形式,每次仅可打开一个部分,该部分展开时将填充折叠容器的整个空间。要了解这种容器,最好的方法就是观察示例,因此下面我们将给出一个示例。

首先,将清单 20 所示的代码添加到您的模板的 HTML 部分中。

清单 20. 创建一个折叠容器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<div style="width: 535px; height: 290px">

    <div dojoType="dijit.layout.AccordionContainer" style="width: 100%;

height: 100%;">

         <div dojoType="dijit.layout.ContentPane" title="Blade 1">

             This is the content in blade 1.

         </div>

         <div dojoType="dijit.layout.ContentPane" title="Blade 2">

             This is the content in blade 2.

         </div>

        <div dojoType="dijit.layout.ContentPane" title="Blade 3">

            This is the content in blade 3.

        </div>

    </div>

</div>

请不要忘记您的 dojo.require 引用(请参见清单 21)。

清单 21. 将折叠容器添加到 dojo.require

1

2

dojo.require("dijit.layout.AccordionContainer");

dojo.require("dijit.layout.ContentPane");

在您的浏览器中打开折叠容器,结果应如图 11 所示。

图 11. 折叠容器实例

3 个水平选项卡,第一个选项卡处于展开状态,填满了整个窗口,另外两个选项卡处于折叠状态。

要在不同的视图之间进行切换,只需单击相关部分(我更喜欢称之为 blade)的标题即可。

边框容器布局

最后,我们来看看边框容器。如果您过去使用过用户接口库,例如 Swing,那么您可能会熟知边框容器的概念,它允许您将组件放置在四个区域中:东、南、西、北。Dojo 中提供了同样的概念,但能提供分隔线,因此更为强大。同样,最好通过示例来进行说明,因此我们来构建一个示例(如清单 22 所示)。

清单 22. 创建一个边框容器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<div style="width: 535px; height: 290px">

    <div dojoType="dijit.layout.BorderContainer" style="width: 100%;

height: 100%;">

        <div dojoType="dijit.layout.ContentPane" region="top" splitter="true">

            This is the content in the top section.

        </div>

        <div dojoType="dijit.layout.ContentPane" region="left" style="width: 100px;"

splitter="true">

            This is the content in the left section.

        </div>

        <div dojoType="dijit.layout.ContentPane" region="center" splitter="true">

            This is the content in the center section.

        </div>

        <div dojoType="dijit.layout.ContentPane" region="right" style="width: 100px;"

splitter="true">

            This is the content in the right section.

        </div>

        <div dojoType="dijit.layout.ContentPane" region="bottom" splitter="true">

             This is the content in the bottom section.

         </div>

     </div>

</div>

清单 22 创建了一个拥有顶端部分和底端部分的布局,左、右和中心部分位于其间。在尝试之前,请将以下代码(如清单 23 所示)添加到您的 dojo.require 部分中。

清单 23. 将边框容器添加到 dojo.require

1

2

dojo.require("dijit.layout.BorderContainer");

dojo.require("dijit.layout.ContentPane");

启动您的浏览器,打开刚刚保存的文件。您应看到如图 12 所示的效果。

图 12. 边框容器实例

包含顶端部分、底端部分以及两者之间的另外 3 个部分的窗口。

这不仅为应用程序创建了一种结构良好的布局,而且能够定制布局,用户可以拖动各窗格的中心手柄,通过拖动来调整应用程序特定部分的大小。对于一个甚至都没有使用 JavaScript 的应用程序来说(除了 dojo.require 调用之外),这令人印象非常深刻。

正如您在这一节中所看到的那样,Dijit 使得为应用程序创建高级布局变得极为轻松,完全不需要复杂的 JavaScript 代码。本节中使用的所有布局组件均可通过编程的方式创建。相关示例请参阅 Dojo 文档(参见 参考资料 部分)。

DojoX:Dojo 的绑定扩展库

除了 Dojo Base、Dojo Core 和 Dijit 库之外,Dojo 还提供了对于 DojoX 的支持,这是一组并未纳入框架其他部分的实验性和补充性的组件和特性。未纳入框架其他部分的原因各式各样,可能是代码尚未准备好投入生产,可能是由于过大而不适于包含在默认部分中,也可能仅仅是因为扩展并未得到广泛利用,或者不像 Dojo 工具包主要部分中包含的特性那样存在普遍的需求。因此,在使用 DojoX 组件时,您应该倍加谨慎,部分此类组件可能未经过全面的测试或者支持可访问性或国际化的认证。

DojoX 包括多种附加函数。下面的列表给出了 Dojox 提供的部分组件示例:

  • 音频/视频回放
  • 图表绘制
  • Comet 客户端
  • 适合多种不同数据源的广泛的数据存储,包括 CouchDB 数据库、CSV 文件,以及 Flickr、Google Search、Amazon S3 等 Web API
  • 矢量绘制 API
  • 附加的表单 widget
  • 数据网格
  • 图像 widget(包括图片库、幻灯片放映和灯箱)
  • JSON 查询
  • 更多布局容器
  • RPC 支持
  • 多种其他 widget,包括仪表、其他日历和选色器、鱼眼 widget、文件选取器、横幅广告交替组件等

在您的应用程序中包含 DojoX 扩展是非常简单的。其他 JavaScript 库需要您浏览存储库、下载额外的文件、将其上传至服务器、在您的代码中引用这些文件,而 DojoX 截然不同,其工作方式与 Dijit 组件大体相同。最简单的说明方法就是给出示例,因此我们将创建一个新页面,使用 DojoX 的评分表单 widget。

首先,我们将使用 清单 1 中的基本 Dijit 模板创建一个新页面。在顶端包含 claro.css 文件的代码行下方,添加第二个 <link> 标签,加载评分 widget CSS 文件:<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/dojo/1.5/dojox/form/resources/Rating.css" />。

接下来,在代码的 HTML 部分中,添加以下代码行,添加一个有五颗星可供选择的评分控件,默认选择三颗星:<div dojoType="dojox.form.Rating" numstars="5" value="3"></div>。

最后,使用前述 dojo.require 载入 Dijit 组件时,添加以下代码行:dojo.require("dojox.form.Rating");。

到这里,我们的工作就完成了。实际上,这就是在您的应用程序中使用 DojoX 组件所需的全部工作。当然,部分较为复杂的 Widget(例如网格等)可能需要比这种基本组件更多的工作,但所需的基本步骤都是相同的。最终结果应如图 13 所示。

图 13. DojoX 评分 widget 实际效果

包含五颗星的窗口,其中三颗星显示为黄色。

如需了解有关 DojoX 及其提供的全部特性的更多具体信息,请参阅 Dojo 文档。参考资料 部分中提供了此文档最新版本的链接。

结束语

在这篇文章中,您应该已经了解到,Dojo 并不仅仅只是一种 JavaScript 框架。Dijit 组件库提供了大量易于使用的 widget,它们能够显著增强您的应用程序的可用性,并使开发人员不必从零开始编写这些组件。除此之外,所有 Dijit 组件都是完全对主题友好的,使您可以轻松利用 Dojo 构建适合您自己的应用程序的功能。在这篇文章中,我们学习了如何利用 Dijit 以声明式和编程式创建组件,以及如何定义希望使用的主题。本文还了解了如何通过简单的几行代码打造令人印象深刻的布局。最后,您应该已经看到添加 DojoX 为您的应用程序提供的扩展特性是多么轻松,完全不需要下载和配置额外的插件。

精通Dojo by Dojo之父 Dojo是一个非常强大的、面向对象的、开源的JavaScript工具箱,它为开发富客户端Ajax应用提供了一套完整的小部件和一些特效操作。曾经有人这样说:“对于一个Web开发者而言,如果没有Dojo,他将是一个“残废”的开发者,只能依靠自己的力量蹒跚前行。“ 在众多的Ajax框架中,Dojo与Prototype和Ext JS一样,备受开发者青睐。Dojo是一款非常优秀的框架,但是它和Ext JS一样,缺乏完善而系统的参考资料。鉴于此,图灵公司引进了Dojo之父亲自撰写的《Mastering Dojo》一书。 本书对Dojo进行了全面而深入地阐述,包括基本使用和高级技巧。全书以一个能让读者迅速上手的简单示例开篇,进而读者们将了解到Dojo的核心,也就是Dojo所有功能的基础。通过本书,读者将学会如何在开发中将自己的项目模块化,还将学到该JavaScript库在核心功能方面的一些增强。学习完本书后,读者不仅能熟悉Dojo框架的使用,还能了解Ajax框架的工作原理,最重要的是,还能随心所欲地开发出自己的RIA应用。 立即下载

相关推荐

多文件上传 dojo组件 dojox.form.FileUploader

NULL 博文链接:https://mojianpo.iteye.com/blog/753665

Dijit简介

从架构层次上来说,dijit位于dojo之上,“是Dojo中界面控件的总称,他们使用灵活而且易于理解。每个Dijit控件都是由Dojo类以及控件中使用的图片,CSS等资源文件共同组成。通过Dijit架构,可以方便的创建灵活、可扩展、可定制外观的控件”。(引用认识Dojo中的界面控件:Dijit )         dijit基本用法         dijit的用法有两种:一种是声明式(在H

feifei2211的专栏 1777

精通Dojo 中文版PDF版(高清)

深刻剖析Dojo工作原理,Dojo之父执笔的权威之作,国内权威社区DOJO中国组织翻译。 Doio是一个功能强大的面向对象开源JavaScript工具包,它为开发新一代Web程序提供了一套完整的小部件和一些特效,得到了IBM、Sun、Zend等公司的大力支持。 本书是Dojo之父Alex Russell与人编著的一部Dojo权威之作,全面深入地阐述了Dojo的基本用法、高级技巧和内部机理。全书先引入一个能让读者迅速上手的简单示例,进而逐步介绍TDojo的核心内容。最后给出应用Doio开发RlA应用的实例。通过本书,读者不仅可以熟悉Dojo框架的使用技巧,更可以借助它随心所欲地开发出自己的RIA应用。 内容简介 本书详尽阐述了Dojo和Dijit。第一部分展示如何使用Dojo快速简便地构建强大的应用;第二部分多方面讨论了Dojo Core,它是Dojo中所有功能的基础;第三部分讲述Dijit,即Dojo小部件系统;第四部分展示如何构建富因特网应用程序。书中各个部分都提供了真实有效的示例代码,并经过了测试。 本书适合具备基本Web编程经验的开发人员阅读。

dijit_使用Dijit组件框架创建丰富的用户界面

什么是Dijit? 发展有关此主题的技能 此内容是用于提高技能的渐进知识路径的一部分。 请参阅Dojo开发入门 Dijit是Dojo Toolkit的丰富组件的用户界面库。 这些组件完全可以主题化,可以使用HTML样式的标签进行声明,也可以使用JavaScript进行编程。 本节简要介绍了Dijit,介绍了Dijit必须提供的组件,并介绍了现成的各种主题。 丰富的用户界面组...

cuyi7076的博客 932

Dojo 小部件开发演示

dojo dijit 小部件开发,将两个 Button 和一个 FilteringSelect 进行组合构成一个新的部件,便于开发部署,减少代码量.

精通Dojo(中文版)

Dojo是一个用javascript语言实现的开源DHTML工具包。它是在几个项目捐助基础上建立起来的(nWidgets,Burstlib,f(m)),这也是为什么叫它a"unified"toolkit的原因。Dojo的目标是解决开发DHTML应用程序遇到的那些,长期存在、历史问题(historical problems with DHTML)。跨浏览器问题。

使用Dijit实现界面组件化开发

对于组件化的软件工程设计,很多开发人员都比较熟悉。组件化的设计适合于复杂的软件系统和团队协作开发。把软件系统划分成若干个组件,组件之间通过预先定义好的接口和协议进行通讯和协作,共同完成整个软件系统的职责。团队中的开发人员可以各自负责不同的组件。组件化的思想在桌面应用和Web应用后台开发中比较流行,相关的技术和实践都比较成熟。而在Web应用的前端部分,组件化一直进展得比较缓慢。这其中的原因有很多,最主要的是Web应用的前端在开始的时候比较简单,没有组件化和设计的必要。随着Ajax应用的流行,Web前端部分越发

Dojo中文博客 5216

思科9117AP从零配置EWC模式实战:Wi-Fi6网络搭建避坑指南

本文详细介绍了思科9117AP在Wi-Fi6网络环境下配置EWC模式的实战指南,涵盖镜像准备、网络环境配置、模式转换步骤及高级运维技巧。通过EWC模式,企业可实现控制器与AP的一体化部署,显著降低成本和简化运维,特别适合中小企业Wi-Fi6网络搭建。

weixin_28318011的博客 333

掌握 Dojo 工具包,第 5 部分: Dojo 的 UI 组件库 - Dijit

http://www.ibm.com/developerworks/cn/web/wa-lo-dojointro5/index.html Dijit 简介 从 Dojo 0.9 开始,Dojo 把 Widget 从 Dojo 的核心包中分离出来,组成 Dijit 。 Dojo 在 Dijit 中为 Widget 家族添加了多位成员,增强了 Widget 的实力的同时也加快了其在页面中的加载...

小头猪 506

【暂时完结】Prescan学习笔记

Prescan学习记录1. Prescan基础知识1.1 Conventions·坐标1.2 Road segment·道路片段1.2.1 让一个路段连接其他两个路段1.2.2 配置车道线1.2.3 Road marking·道路标志1.3 Trajectory·轨迹1.3.1 建立一个Path·路径1.3.2 配置Speedprofile1.3.3 Synchronization of Trajectories·轨迹同步1.3.4 Multiple trajectories · 多轨迹分配 1. Pres

dreautumn的博客 1万+

pyautogui库详细教程,逐行注释(附项目实战:基于图像识别实现崩坏星穹铁道自动化测试)

本文包含了pyautogui的使用方法与常见问题指南,随文附带对游戏实现的自动化项目源码与说明文档

m0_53043024的博客 1万+

从头开始学习 Dojo,第 3 部分: 利用 Dijit 组件框架打造丰富的用户界面

Dojo 工具包提供了大量的特性,这些特性节省了 Web 应用程序开发人员开发时间和工作量,使他们能够创造丰富的 Internet 应用程序。从 DOM helper 和 Ajax 到完善的 widget 库和面向对象的特性,Dojo 实际上包括您构建大规模的通过 “异步 JavaScript 和 XML” (AJAX) 提供助力的 Web 应用程序所需的一切。如果 Dojo 本身中未包含您正

NULL BLOG 3082

uniapp: err = err.replace(this._UNI_INPUT_DIR_REG, ‘UNI_TypeError: err.replace is not a function问题修复

问题:uniapp的依赖包出现了问题,需要升级解决办法:升级uniapp依赖包,下载"semver"和”@dcloudio/uni-i18n“两个包,本地锁定postcss为7版本,就解决了。

py_boy的博客 1453

用SOEM库搞定汇川SV660N伺服电机:一个Linux C程序员的EtherCAT实战笔记

本文详细介绍了如何在Linux系统下使用SOEM库驱动汇川SV660N伺服电机,包括环境搭建、EtherCAT从站设备识别、PDO映射配置、状态机切换与运动控制等关键步骤。通过实战代码示例和常见问题排查指南,帮助开发者快速掌握工业自动化中的EtherCAT通信技术,实现对伺服电机的精准控制。

weixin_29185199的博客 426

单片机通信总述——理论部分(CAN、串口、SPI、I2C等)

并行通信:传输原理:数据各个位同时传输;优点:速度快; 缺点:占用引脚资源多。是指使用 8、16、32 及 64 根或更多的数据线(有多少信号为就需要多少信号位)进行传输的通讯方式,可以同一时刻传输多个数据位的数据。串行通信: 传输原理:数据按位顺序传输;优点:占用引脚资源少; 缺点:速度相对较慢。是指设备之间通过一根数据信号线,地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式,同一时刻只能传输一位(bit)数据。 单工: 数据传输只支持数据在一个方向上传输。信息只能单方向传输的工作方式,一

qq_42475191的博客 1万+

Dojo 1.6 官方教程: 创建自定义Dojo小部件(Widget)

在这个教程中,我们将会演示如何利用Dojo 和Dijit框架来创建自定义的小部件。 主要会使用到dijit._Widget 和dijit._Templated 基类和mixin。 对dijit框架的基础知识,可以参看前两篇教程 难度:中等 适用Dojo版本: 1.6

Dojo中文博客 1万+

目标检测数据集 第069期-基于yolo标注格式的玻璃清洁状态检测数据集(含免费分享)

但这类技术的落地,离不开大量标注规范、场景丰富的数据集作为算法训练的支撑,玻璃清洁状态检测数据集的出现,正是为了满足这一市场与技术需求。在高校与科研机构的计算机视觉研究中,该数据集可作为基础研究素材,用于探索物体状态识别的算法优化方向,比如针对玻璃这类透明物体的检测算法改进,或是小样本场景下的状态识别研究。通过摄像头采集车窗、挡风玻璃的图像,算法自动检测玻璃清洁度,若识别到脏污影响视线,及时提醒运维人员清洁,避免因玻璃脏污引发的安全事故,提升交通出行的安全性。

深度学习算法工程师,专注于前沿算法研究与实战应用。在这里,我将分享深度学习领域的实战经验、优质数据集资源以及最新论文解读与精度分析,旨在与广大技术爱好者共同探索人工智能的奥秘,助力技术成长与创新。 128

Learning Dojo : Overview

实习一个多月了,一直在做些Mashup Maker上的Widgt,全是基于Js的Dojo工具包的。不过一直也没系统的学习,都是做的东西需要什么就去找相应的资料文档,感觉知识不太成体系。这几天,没那么忙了,想系统点的学习一下。主要资料来源为The Book of Dojo, Dojo Campus, Mastering Dojo 等英文文档,再加上我自己的一些使用心得吧。首先简要介绍一下Dojo

技术流 752

5.17华为OD机试真题 新系统 - 输出二叉树后序遍历结果 (Java/Py/C/C++/Js/Go)

5.17华为OD机试真题 新系统 - 输出二叉树后序遍历结果 (Java/Py/C/C++/Js/Go)

算法大师! 519

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Dojo学习笔记(二十一):创建自定义Dojo小部件

在这个教程中,我们将会演示如何利用Dojo 和Dijit框架来创建自定义的小部件,主要会使用到dijit/_WidgetBase and dijit/_TemplatedMixin。 Dojo的Dijit 库包含了丰富的界面小部件(Widgets),通过使用这些小部件,可以打造出强大的Web应用界面,从高级的表单元素,到复杂页面布局。...

weixin_34387284的博客 324

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

突破视频生成瓶颈:Mora多智能体框架如何重塑AI视频创作

在视频生成技术快速发展的今天,许多开发者面临着一个共同的技术挑战:如何让AI理解复杂的视频创作需求,并生成高质量、连贯的动态内容?传统的单模型方法往往在视频一致性、场景转换和创意实现方面存在局限。开源项目Mora应运而生,它通过创新的多智能体协作架构,为这一技术瓶颈提供了全新的解决方案。 Mora是一个开源的多智能体视频生成框架,旨在模拟并扩展OpenAI Sora的能力。它通过多个专业智能体的

gitblog_00080的博客 565

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: 从头开始学习 Dojo,第 2 部分 使用 Dojo 掌握面向对象开发
下一篇: Layer.js——强大的弹出框
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值