Dojo 及 HTML 5 简介
Dojo 是目前最流行的开源 JavaScript 工具库之一,很多开发者以及企业用户都把Dojo 作为首选的 JavaScript 工具。Dojo 为 Web 应用的开发提供了大量的客户端组件,能够让你可以方便的进行 HTML DOM 操作、拖拽、AJAX 调用、定制可视化控件等来使得你的 Web 应用变成富网络应用 (RIA)。而且 Dojo 在性能、可访问性、多语言支持以及文档方面都做的非常出色,这也是企业选择 Dojo 的原因之一。
51CTO推荐专题:HTML 5 下一代Web开发标准详解
HTML 5 是最新一代的 HTML,它将成为 HTML、XHTML 以及 HTML DOM 的新标准, HTML 5 是 W3C 与 WHATWG 合作的结果,目前仍外于开发中 ; 自从上一代 HTML4,Web 世界已经发生了巨大的变化,HTML 5 的到来将更大的促进 Web 的发展,HTML 5 提供了很多新的功能,主要有:
◆新的 HTML 元素,例如 section, nav, header, footer, article 等
◆用于绘画的 Canvas 元素
◆用于多媒体播放的 video 和 audio 元素
◆用于定位的 Geolocation API
◆本地存储以及离线应用
◆Web Workers
◆拖拽 API
◆文件 API
我们主要对 HTML 5 的拖拽功能进行讲解,并结合文件 API 与桌面进行交互。来与 Dojo 的 dnd 拖拽组件进行比较。
使用 Dojo 创建及定制拖拽应用
类似 Dojo 其他组件,拖拽的实现有两种方式:声明式和编程式。在这里我们使用声明式的方式做简要的介绍。
在 Dojo 拖拽实现中,有两个重要的元素 dojo.dnd.Source 和 dojo.dnd.Target。这两个元素分别标示了拖拽中的源容器 Source 和目标容器 Target。值得注意的是源容器 Source 默认也是目标容器 Target,而不需要作目标容器 Target 的声明。我们在源容器 Source 中创建一些可以拖动的元素,要让这些元素可拖动,我们要为这些元素添加 class 属性值 DojoDndItem。下面的示例代码定义了一个源容器 Source 以及一些可以拖动的元素。在这些可以拖动的元素中我们可以定义它们的拖拽类型 dndType。dndType 的值开发者可以自己定义,而目标容器 Target 元素的 accept 属性定义了该目标容器接受的拖拽类型。
清单 1. 创建拖拽的源容器和可拖拽的元素
- <div id="source" style="height:400px;" dojoType="dojo.dnd.Source">
-
<div id="item1" class="dojoDndItem item" dndType="divItem">item1</div>
-
<img src="w3c.jpg" class="dojoDndItem item" dndType="imageItem"></img>
-
<a href="http://www.w3.org/TR/html5/" class="dojoDndItem item" dndType="linkItem">
-
HTML5 specification</a>
-
</div>
对于 Target 我们可以创建一个 div,然后加上属性 dojoType=”dojo.dnd.Target”和属性 accept。不在 accept 中的类型的 dojoDndItem 元素将不被这个容器接受。例如清单 2 中的目标容器只接受 divItem 和 imageItem 这两种类型,那么清单 1 中的 linkItem 将不能被拖到这个目标容器中。
清单 2. 创建拖拽的目标容器和可接受的类型
- <div id="target" style="height:400px;" dojoType="dojo.dnd.Target"
-
accept="divItem, imageItem">
真正 Web 应用的拖拽没有这么简单,开发者往往需要在拖拽的过程中更多的介入。这时候可以通过对 Dojo 提供的 dojo.dnd.Source 和 dojo.dnd.Target 进行继承扩展,开发满足业务需要的功能和特性。这里将不赘述。
使用 HTML 5 创建拖拽应用
在这一章中,我们将要使用 HTML 5 创建一个简单的拖拽应用,如图 1 所示,用户可以把网页上内容从左边的区域拖放到右边的区域。这个应用程序的代码可到附件中可以下载。
图 1. HTML 5 拖拽应用效果图
创建可以拖动的节点
使用 HTML 5 创建拖拽只需要对可拖拽的节点进行声明——给可以拖拽的节点添加 draggable 属性并设值为 true。如清单 3 中的 div 节点,通过添加 draggable 属性就可以拖拽了。在 HTML 5 中<img>和<a> 默认情况下是可以拖拽的,所以不需要设置 draggable 属性。
清单 3. 通过添加 draggable 属性来创建源容器中可以拖动的节点
- <div id="source" style="height:300px;">
-
<div id="item1" class="item" draggable="true">item1</div>
-
<img id="item2" src="w3c.jpg" class="item"></img>
-
<a id="item3" href="http://www.w3.org/TR/html5/" class="item">HTML5 specification</a>
-
</div>
创建 HTML 5 拖拽的源容器和目标容器
在 HTML 5 中,我们需要给指定的节点来绑定一些事件来使之成为具有源容器或目标容器的功能。在 HTML 5 的拖拽过程中的事件有 7 个,分别是应用在目标容器或拖动节点上的 dragstart, drag, dragend 等 3 个事件,以及应用在目标容器节点上的dragenter, dragover, dragleave 和 drop 等 4 个事件。表 1 中对这些事件的触发机制和常见的操作进行了描述。
表 1. HTML 5 拖拽过程中可以绑定的事件
备注 : 在 Dojo 中所有 dnd 源容器或目标容器在拖拽开始时都会调用 onDndStart 事件方法,而在 HTML 5 中只有拖动的节点及源容器可以触发 dragstart 事件,其他容器包括目标容器在拖动开始时不会感知源容器及拖动节点的 dragstart 事件。
清单 4 展示给目标容器绑定 dragenter, dragover, dragleave, drop 事件的示例代码。在 dragenter 和 dragleave 事件中,我们对目标容器的背景样式进行修改使得用户感知目标容器的状态(如图 2 所示)。在 dragover 事件中我们对清单 3 中的链接元素(id 属性值为 item3)的节点进行了限制。drop 事件中我们要把拖动的节点插入到目标节点的 DOM 结构中。
清单 4. 创建目标容器的事件
- var target = dojo.byId('target');
- dojo.connect(target, 'dragover', function(e){
-
// doesn't allows link item (id = “item3”) to drop
- if (e.dataTransfer.getData('id') != "item3"){
- e.preventDefault();
- }
- });
-
- dojo.connect(target, 'dragenter', function(e){
- //add style
- dojo.addClass(target, "over");
- });
-
- dojo.connect(target, 'dragleave', function(){
- //remove style
- dojo.removeClass(target, "over");
- });
-
- dojo.connect(target, 'drop', function(e){
- //remove style if drop is successful
- dojo.removeClass(target, "over");
-
- // stops the browser from redirecting
- if (e.stopPropagation) e.stopPropagation();
-
-
-
var itemId = e.dataTransfer.getData('id');
-
var dragItem = dojo.byId(itemId);
- e.target.appendChild(dragItem);
-
- }
图 2. 当拖动节点到目标容器是时对目标容器进行高亮显示
从清单 4 中我们在目标容器上对事件对象的 dataTransfer 属性进行了 getData 操作——取出了关键字 id 对应的数据。在 HTML 5 拖拽过程中,用户可以在表 1 定义的事件里通过 event.dataTransfer 得到 DataTransfer 对象 ( 详见 W3C 网站上的接口定义)并对其进行定制传输数据、定制拖拽影像等操作。例如我们可以在 dragstart 事件中通过 setData 方法初始化数据(代码详见附件)。表 2 中列出了这各数据对象的方法及常用的用途。
表 2. DataTransfer 的常用方法
与桌面进行交互
除了在网页中对一些页面上的元素进行拖拽以外,HTML 5 扩充的 API 还允许网页与文件系统进行交互,比如从文件系统拖一个或几个文件到网页中,或是从网页拖到文件系统中。以前者为例,当我们从桌面或其它文件夹拖动文件到网页上某个目标结点时,我们可以通过 DataTransfer 的 files 属性得到这些文件数量以及文件的属性及内容。DataTransfer.files.length 的大小即为拖动文件的数量,当没有拖动文件时,files.length 的大小即为 0,可用来判断是否有文件拖动。
清单 5. 通过 dataTransfer.files 拿到文件对象
- var files = e.dataTransfer.files;
-
var msg = "";
-
for (var i = 0; i < files.length; i++) {
- console.log ("Name: " + files[i].name + ", fileSize: " + files[i].size);
-
var dataReader = new FileReader();
-
dataReader.onload = function(){
- msg += ("content: " + dataReader.result);
- }
- dataReader.readAsText(files[i]);
- }
从清单 5 中的代码中我们可以看到 files 中存储了若干 file 对象,通过这个对象可以获取文件名,文件大小等。然后我们可以通过 FileReader 获取文件的内容。获取内容的 FileReader 并不是 HTML 5 拖拽的功能,而是借助了 File API 。它可以以文本,二进制,以及 dataURL 的形式读取,实现读取文件内容实现文件上传等,在我们的示例代码 HTML 5dndfile.html 中我们演示了通过 readAsText 方法读取文本文件和通过 readAsDataURL 方法读取图像文件的使用。
与桌时行交互时,我们只需要对将清单 5 中给出的代码稍加修改加到目标容器的 drop 事件中,其它事件不用修改。例如清单 6 所示。
清单 6. 在目标容器的 drop 事件读取文本文件的内容
- dojo.connect(textdiv, 'drop', function(e){
- if (e.stopPropagation){
- e.stopPropagation(); // stops the browser from redirecting
- }
-
var files = e.dataTransfer.files;
-
var msg = "";
-
for (var i = 0; i < files.length; i++) {
- msg += ("Name: " + files[i].fileName + ", fileSize: " + files[i].fileSize);
-
var dataReader = new FileReader();
-
dataReader.onload = function(){
- msg += ("content: " + dataReader.result);
-
textdiv.textContent = msg;
- }
- dataReader.readAsText(files[i]);
- }
- });
这样当我们拖动一个文本文件到指定的目标区域时,我们就可以看到文件内容。
Dojo 和 HTML 5 拖拽功能的比较和选择
Dojo 实现了一套完整的拖拽框架和事件机制,并提供了默认的实现,用户可以通过声明的方式快速实现拖拽,而且还可以通过继承默认的 Source、Target 以及 Avatar 实现拖拽定制化。从使用经验上来看,Dojo 更倾向于完整的 DOM 节点操作,而数据的传输往往是通过绑在 DOM 节点上的属性实现的。
HTML 5 的拖拽现在还在规范的定制和完善中,各个主流浏览器对该规范的支持也是各有千秋,基本上还处于发展的阶段。本文中提供的示例仅在 Firefox 3.6 以上版本测试通过。HTML 5 作为新时代的 HTML 协议,拖拽事件中的 DataTransfer 接口体现了拖拽过程中以数据传输为中心的发展前景。与此同时,跟 File API 的结合可以使得 Web 应用的数据交互通过拖拽操作延伸到最终用户的桌面及文件系统上。另外 HTML 5 还可以实现在不同浏览器窗口之间的拖拽操作,也是拖拽过程传输数据的一种应用。
小结
对比 Dojo 和 HTML 5,我们不难发现在使用 Dojo 比 HTML 5 可以更容易地开发出体验效果非常好的拖拽应用;而 HTML 5 作为 HTML 的新规范,注重了拖拽过程中数据传输的重要性。两者如果可以融合则可以互补其短。通过实验,笔者发现 Dojo dnd 与 HTML 5 拖拽暂时不能在同一结点上同时使用,由于 Dojo 是在 HTML4 规范基础上的工具包,它们之间可能因在事件上的冲突会导致 HTML 5 拖拽不可用。但是我们有理由相信,随着 HTML 5 规范的发展,将会有支持 HTML 5 拖拽的工具包出现,届时开发者可以更为便捷的开发出更为丰富的 Web 应用。
原文链接:http://www.ibm.com/developerworks/cn/web/1102_guoqing_draganddrop/
相关推荐
- **概述**:DojoX是Dojo的扩展库,它包含了大量的附加功能,从表格小部件到绘图库等,如ENHANCEDGRID、2D/3D图形、图表等。 - **用途**:DojoX为开发者提供了更多的可能性,使其能够根据项目的特定需求选择合适的...
- **引入Dojo库**:将下载的Dojo库文件放入项目中,并通过`<script>`标签引入到HTML页面中。 - **编写Dojo代码**:利用Dojo提供的API来实现所需的功能。 - **调试与测试**:利用Dojo自带的工具或第三方工具进行调试...
使用CDN上的DOjo非常快捷,用户只需添加一个script标签到HTML文件中就可以使用DOjo。 DOjo的基本使用 DOjo是一个JavaScript库,提供了许多有用的功能,如DOM操作、事件处理、AJAX请求等。DOjo的使用需要一个网络...
### Dojo 快速入门详解 #### 一、Dojo Toolkit 概览 Dojo Toolkit 是一款开源的 JavaScript 工具包,专为构建现代化 Web 应用而设计。其核心价值在于通过提供一系列高质量的 API 和工具集,极大地简化了 Web 开发...
总结,Dojo提示框是Dojo框架中的重要组件,它提供了多种方式来实现用户交互,包括基础提示框、确认提示框和可拖动提示框。理解和掌握这些用法,将有助于提升你的Web应用的用户体验。通过学习和实践,你可以灵活运用...
### Dojo Toolkit 简介 Dojo Toolkit 是一个开源的 DHTML 工具包,主要用 JavaScript 编写。该工具包旨在解决 Web 开发领域内存在的一些长期历史问题,如浏览器兼容性问题,并提供了丰富的功能来帮助开发者构建动态...
Dojo 工具包不仅仅是一个简单的JavaScript库,它几乎涵盖了Web应用开发的所有方面,从DOM操作到Ajax通信,再到高级功能如拖放支持。通过使用Dojo,开发者可以避免重复造轮子,专注于业务逻辑的实现。对于任何希望...
同时,dojo Tree也支持拖放操作(drag-and-drop),通过`dndController`配置,可以实现节点的拖动和放置。 对于那些希望深入理解dojo Tree工作原理的开发者,阅读源码是一个非常有价值的途径。Dojo Toolkit是开源的...
Dojo GUI v6模板则将这些组件以可拖拽的形式集成到Pencil中,使得非编码人员也能方便地利用这些专业级别的组件进行原型设计。这大大提升了设计效率,减少了设计师在寻找合适UI元素上所花费的时间。 该压缩包包含两...
### Dojo之路:如何利用Dojo实现Drag and Drop效果 #### 概述 随着Web开发技术的不断进步,用户界面的交互性和动态性也日益增强。Drag and Drop(拖放)作为一种直观的操作方式,在现代Web应用中变得越来越普遍。...
- **dojo.dnd**:用于实现拖拽功能的API。 - **dojo.string**:提供了一系列字符串处理方法,如修整、转换大小写、编码等。 - **dojo.date**:日期处理工具,可以解析不同的日期格式。 - **dojo.event**:事件...
Dojo 为 Web 应用的开发提供了大量的客户端组件,能够让你可以方便的进行 HTML DOM 操作、拖拽、AJAX 调用、定制可视化控件等来使得你的 Web 应用变成富网络应用 (RIA)。而且 Dojo 在性能、可访问性、多语言支持以及...
CSS定义了可拖动元素的样式,而`dojo.js`是Dojo的核心库。JavaScript部分是关键,它定义了拖放行为。`dojo.require`加载了所需的Dojo模块,如`dojo.style`和DnD模块。 `init`函数初始化拖放功能。它遍历具有特定...
【标题】"已配置好的arcgis_js_49_api可直接...只需将这些文件上传到服务器,然后通过浏览器访问对应的HTML文件,即可启动应用。这对于快速原型开发或快速演示GIS功能非常有帮助,大大缩短了开发周期,提高了工作效率。
6. **加载地图到页面**: 将创建的地图对象加载到之前定义的HTML容器中,通常在`dojo/domReady!`或`esri/mapHandler`加载完成后执行。 ```javascript require(["esri/map", "dojo/domReady!"], function(Map) { //...
它扩展了Prototype的Ajax功能,提供了如`Effect`(动画效果)、`Builder`(HTML构建器)、`Draggable`(可拖动元素)等模块。在Ajax方面,script.aculo.us提供了一些高级组件,如`Autocompleter`(自动补全输入框)...
5. **CSS和HTML**:`drewonmap.html`和`index.html`是HTML页面,它们包含了地图的容器元素和必要的CSS样式。CSS用于控制地图的外观,包括大小、位置以及框选矩形的样式。HTML结构则提供了页面的基本布局和交互元素。...