- 浏览: 1649215 次
- 性别:
文章分类
- 全部博客 (2929)
- 非技术 (18)
- Eclipse (11)
- JAVA (31)
- 正则表达式 (0)
- J2EE (4)
- DOS命令 (2)
- WEB前端 (52)
- JavaScript (69)
- 数据库 (8)
- 设计模式 (0)
- JFreechart (1)
- 操作系统 (1)
- 互联网 (10)
- EasyMock (1)
- jQuery (5)
- Struts2 (12)
- Spring (24)
- 浏览器 (16)
- OGNL (1)
- WebService (12)
- OSGi (14)
- 软件 (10)
- Tomcat (2)
- Ext (3)
- SiteMesh (2)
- 开源软件 (2)
- Hibernate (2)
- Quartz (6)
- iBatis (2)
最新评论
1 .拖放简介
EXT 中的拖放有如下功能:
1, 拖放表格里的行,让它们按照指定的方式排列;
2, 拖放树里的节点,把节点从一个枝干拖向另一个枝干;
3, 在表格和树之间进行拖放;
4, 布局的 split 也是一种拖放,可以改变布局的大小;
5, Resize 也算是拖放,改变大小。
2.拖放的简单运用
对于 B/S 系统而言, 拖放一直是一项很少用到的功能。我们一直认为实现拖放功能很复杂,但是在 EXT 中只需要一行代码就可以实现最基本的拖放功能,如下面的代码:
New Ext.dd.DDProxy(‘block’);
对应的 HTML 部分的代码如下所示:
<div id=”block” style=”background: red;”>$nbsp;</div>
如果不进行任何修饰,我们根本无法看到拖放的效果,因为我们为 block 加上了红色的背景色。现在我们可以任意拖动这条红色的 div 了,体验 EXT 为我们提供 的拖放功能:
3 拖放组件体系
让我们先看一下拖放的继承关系图:
-> Ext.dd.DD-> Ext.dd.DDProxy -> Ext.dd.DragSource-> Ext.dd.DragZone
Ext.dd.DragDrop
-> Ext.dd.DDTarget -> Ext.dd.DropZone
图 2. 拖放的继承关系图
简单来说,上面的四个组件都是可以随意拖动的。拖动起来以后,直接吧他们放到下边那些定义好的区域中。 Proxy 表示可拖动对象, target 表示拖动的目的地。
我们看了上面的继承图,并对它有了简单的了解,接下来卡看下面的实例,其中的 proxy 是可以 任意拖放的,如下面的代码所示:
var proxy = new Ext.dd.DragSource(‘proxy’, {group:’dd’});
target 告诉我们可以吧上面的 proxy 放到哪些地方,如下面代码所示:
var target = new Ext.dd.DDTarget(‘target’, ‘dd’);
注意到两者之间相同的 dd 了吗?这是分组标志,用来限制拖放的目的地。只有相同组名的目的地才能接收它,好比超市中货架上的商品都是放在指定区域一样。
不过,这也仅仅指示拖放而已,没有任何其他效果。让我们加入一些小技巧,可以让拖放显得更神奇一些,如下面的代码 所示:
proxy.aferrDragDrop = function(target, e, id){
var destEl = Ext.get(id);
var srcEl = Ext.get(proxy.getEl());
srcEl.insertBefore(destEl);
};
从上面的代码可以看出,拖放后会执行上面代码中的对应函数,并通过 id 获 得 target ,然后根据 proxy.getEl() 获得 proxy ,最后把 proxy 添加到 target 中。上述代码运行后的页面 效果如图 6-3 所示。
ps: html部分 :
< div id = "proxy" style = "background:red" > $nbsp; </ div >
< div id = "target" style = "background:green;height:80;width:100;" > $nbsp; </ div >
当然,为了让拖放效果更清晰明了,我们加 入了很多 CSS 样式。
图 3 拖 放效果,只有在到达 target 时才显示对勾。
4 拖放事件
拖放相关的类都继承自 Ext.dd.DragDrop ,在 DragDrop 中定义了一系列拖放操作过程中需要使用的事件函数,我们可以通过这些事件 函数对整个拖放过程进行控制。
此处提到的时间与 Ext 事件模型没有任何 关系,它们是专门用于处理拖放的函数。例如: startDrag 、 onDrag 、 onDragDrop 、 endDrag 、 onDragEnter 、 onDragOut 、 onDragOver 、 onInvalidDrop 、 onMouseDown 和 onMouseUp ,这些函数分别代表了不同阶段的拖放过程。在实际使用中,我们需要重写 对应的事件函数,从而监听和处理拖放功能。
上述的事件函数可以分为以下 3 大 类:
-startDrag 、 onDrag 、 onDragDrop 、 endDrag 是第一类,它们构成了拖放的主要过程。
- startDrag(int x, int y) :开始拖放时间,参数是 x 和 y 的 坐标值;
- onDrag(Event e) :正在拖放事件,当拖放一个对象事触发,参数是 mousemove 鼠标移动事件;
- onDragDrop(Event e, String|DragDrop[] id) :正在放下事件,当一个对象放到另一个 DragDrop 对象上时触发,第一个参数是 mouseup 鼠标放开事件,第二个参数表示 drop 的目标位置。如果是在 POINT 模式下,就会 传入目标元素的 id 。如果是在 INTERSECT 模式 下,则会传入放下目标的拖放对象数组;
- endDrag(Event e) :拖放结束事件,在拖放操作结束之后触发,参数是 mouseup 鼠标放开事件。
- onDragEnter 、 onDragOut 、 onDragOver 、 onInvalidDrop 是第二类事件,他们细化了用户拖动对象的过程。
- onDragEnter(Event e, String|DragDrop[] id) : 进入 drop 区域事件,拖放过程中首次触碰到 drop 区域时触发。第一个参数是 mousemove 鼠 标移动事件,第二个参数表示 drop 的目标位置。如果是在 POINT 模式下,就会 传入目标元素的 id ;如果是在 INTERSECT 模式 下,则会传入放下目标的拖放对象数组;
- onDragOut(Event e, String|DragDrop[] id) : 离开 drop 区域事件,拖放过程中从 drop 区域离开时触发。第一个参数是 mousemove 鼠标移动事件,第二个参数表示 drop 的目标位置。如果是在 POINT 模式下,就会 传入目标元素的 id ;如果是在 INTERSECT 模式 下,则会传入放下目标的拖放对象数组;
- onDragOver(Event e, String|DragDrop[] id) : 在 drop 区域中拖放移动事件,当在 drop 区域中拖放移动时触发。第一个参数是 mousemove 鼠标移动事件,第二个参数表示 drop 的目标位置。如果是在 POINT 模式下,就会 传入目标元素的 id ;如果是在 INTERSECT 模式 下,则会传入放下目标的拖放对象数组;
- onInvelidDrop(Event e) :不能 drop 事件,不在 drop 区域移动时触发,参数是 mousemove 鼠标移动事件。
- onMouseDown 和 onMouseUp 是第三类拖放事件函数,它们用于对原始鼠标事件进行提示,而且已经融合 在前两类拖放事件函数中了。
onMouseDown(Event e) :鼠标按下事件,参数是 mousedown 鼠标 按下事件。
onMouseUp(Event e) :鼠标放开事件,参数是 mouseup 鼠标放开事件。
5 高级拖放
5.1 Basic
YUI 中包含的 Basic (基础)示例,这个示例是最基本的。
dd1 = new Ext.dd.DD(”dd-demo-1”);
dd2 = new Ext.dd.DD(”dd-demo-2”);
dd2 = new Ext.dd.DD(”dd-demo-3”);
这部分是 javascript代码,创建 3个拖动对象,参数对应 HTML中的 3个 id,让这 3个对象变成可拖动的元素。 HTML部分代码如下
<div id = “dd-demo-1” class = “dd-demo”></div>
<div id = “dd-demo-2” class = “dd-demo”></div>
<div id = “dd-demo-3” class = “dd-demo”></div>
5.2 Handle
把手( handle)就好比菜刀的刀柄,操之以切菜。有三种方式实现 handle。
- 两个把手
<div id = “dd-demo-1” class = “dd-demo”>
<div id = “id-handle-1a” class = “dd-multi-handle-1”>H1</div>
<div id = “id-handle-1b” class = “dd-multi-handle-2”>H2</div>
</div>
- 一个把手
<div id = “dd-demo-2” class = “dd-demo”>
<div id = “id-handle-2” class = “dd -handle”>H</div>
</div>
- 外部把手
<div id = “id-handle-3” class = “dd –ourter-handle”>Outer</div>
<div id = “dd-demo-3” class = “dd-demo”></div>
我们为这些 handle添加功能,如下:
dd1 = new Ext.dd.DD(”dd-demo-1”);
dd1.setHandleElId(“dd-handle-1a”);
dd1.setHandleElId(“dd-handle-1b”);
dd2 = new Ext.dd.DD(”dd-demo-2”);
dd2.setHandleElId(“dd-handle-2”);
dd2 = new Ext.dd.DD(”dd-demo-3”);
dd3.setOuterHandleElId(“dd-handle-3”);
用法很简单,只要调用 Ext.dd.DD的 setHandleElId()函数并绑定对应 handle的 id即可,而 setOuterHandleElId()函数是专门用来指定外部 handle的,通过这些配置,我们就限制用户只能使用 handle对 div进行拖放了。
5.3 On Top
让当前拖放的 div总 在最上。
重写监听拖放事件的 函数:
Ext.ux.DDOnTop = function(id, sGroup, config){
Ext.ux.DDOnTop.superclass.constructor.apply(this, arguments);
};
Ext.extend(Ext.ux.DDOnTop, Ext.dd.DD, {
origz: 0,
startDrag: function(x, y){
var style = this.getEl().style;
this.origZ = style.zIndex;
style.zIndex = 999;
},
endDrag: function(e){
this.getEl().style.zIndex = this.origZ;
}
});
我们定义了一个新对象 Ext.ux.DDOnTop。在拖动的时候,把正在拖放的元素对应的 el的 zIndex树形设置为 999.这个值已经很大了,基本可以保证当前元素一直显示在所有元素的最上面,停 止时再执行 endDrag(),把对应元素 el的 zIndex树形恢复成原来的数据。
下面不需要进行修改了,创建 3个 Ext.ux.DDOnTop对象,就可以实现总在最上的效果。
dd1 = new Ext.ux.DDOnTop(“dd-demo-1”);
dd1 = new Ext.ux.DDOnTop(“dd-demo-2”);
dd1 = new Ext.ux.DDOnTop(“dd-demo-3”);
5.4 Proxy
所谓代理,就是拖放时原 div不动,跟随鼠标移动的是一个名为 proxy的拖放。可以防止需要拖动的对象过大对浏览器造成的负担。
最简单的办法就是吧 Ext.dd.DD改为 Ext.dd.DDProxy,这样就会出现一个只有外框的空白 proxy。
如果我们希望自定义 proxy的形式,如下:
dd3 = new Ext.dd.DDProxy(“dd-demo-3”, “default”, {
dragElId: “dd-demo-3-proxy”,
resizeFrame: false
});
为了实现自定义的 proxy,我们需要在创建时设置 3个参数。第一个参数是对应的 div的 id;第二个参 数是拖放的组,只有同组的 Drag才能放到同 组的 Drop上;第三个参数是附加参数。
dragElId的值是我们自定义的 proxy,而 resizeFrame: false告诉 EXT不用使 proxy的大小与原 div一样。
看下面的代码,第三个 proxy与 dd-demo-3对应,我们还需要在 HTML里加上这个代理对应的 div:
<div id = “dd-demo-3-proxy”>proxy-3</div>
5.5 Group
利用 addToGroup方法:
addToGroup ( sGroup {string} ) : void
Add this instance to a group of related drag/drop objects. All instances belong to at least one group, and can belon...
Add this instance to a group of related drag/drop objects. All instances belong to at least one group, and can belong to as many groups as needed.
Parameters:
- {string} : sGroup
the name of the group
Returns:
- void
注意的是要给 target定义组名:
var slots = [];
//slots
slots[0] = new Ext.dd.DDTarget(“t1”, “topslots”);
slots[1] = new Ext.dd.DDTarget(“t2”, “topslots”);
slots[2] = new Ext.dd.DDTarget(“b1”, “bottomslots”);
slots[3] = new Ext.dd.DDTarget(“b2”, “bottomslots”);
slots[4] = new Ext.dd.DDTarget(“b3”, “bottomslots”);
slots[5] = new Ext.dd.DDTarget(“b4”, “bottomslots”);
第一个参数是 DDTarget对应的 id,第二 个参数就是组名。这里分成了两组。
接下来操作 Ext.dd.DDProxy了,为了高亮显示,我们定义了继承自 Ext.dd.DDProxy的新类型,这些细节不会影响分组操作。
var players = [];
//players
players[0] = new Ext.ux.DDPlayer(“pt1”, “topslots”);
players[1] = new Ext.ux.DDPlayer(“pt2”, “topslots”);
players[2] = new Ext.ux.DDPlayer(“pt1”, “bottomslots”);
players[3] = new Ext.ux.DDPlayer(“pt2”, “bottomslots”);
players[4] = new Ext.ux.DDPlayer(“pboth1”, “topslots”);
players[4] .addToGroup(“bottomslots”);
players[5] = new Ext.ux.DDPlayer(“pboth2”, “topslots”);
players[5] .addToGroup(“bottomslots”);
这样 1、 2号 DDPlayer对应的分组是 topslots; 3、 4号 对应的分组是 bottomslots; 5、 6号绑定到所有的 DDTarget上了。
最后的部分是为 Ext.dd.DragDropMgr设置碰撞检测模式: POINT和 INTERSECT。 POINT对应的值是 0, INTERSECT对应的值是 1,如下面的代码所示:
Ext.dd.DragDropMgr.mode = Ext.get(‘ddmode’).dom.selectedIndex;
Ext.get(‘ddmode’).on(‘change’,function(){
Ext.dd.DragDropMgr.mode = Ext.get(‘ddmode’).dom.selectedIndex;
});
这两者的区别是,在 POINT模式下,当拖放的鼠标进入 DDTarget的范围时才能放下;在 INTERSECT模式下,当拖放的 DDProxy边缘与 DDTarget有重叠时才可以放下。
Ext.ux.DDPlayer的内部很复杂,它继承自 Ext.dd.DDProxy,在内部通过 Ext.dd.DragDropMgr来操作相互之间有关联的元素。
5.6 Grid
示例:
dd1 = new Ext.dd.DD(“dragDiv1”);
dd1.setXConstraint(1000, 1000, 25);
dd1.setYConstraint(1000, 1000, 25);
为拖放对象设置步长,每次拖放时不再平滑移动,而是沿着网格非线性移动。 如果可以根据这个功能自定义页面模板布局,应该是非常不错的。
setXConstraint和 setYConstraint。后面有 3个参数:第一个,左侧(上侧)可以达到的最远距离;第二个,右侧(下侧) 可以达到的最远距离;每次移动的距离。
5.7 Circle
5.8 Region
Ext.ux.DDRegion
相关推荐
通过分析和学习这些代码,你可以更好地理解EXT JS TreePanel拖放功能的实现细节。 总的来说,EXT JS的TreePanel拖放功能提供了丰富的交互性,使得用户可以直观地调整树形结构。通过配置`DragSource`和`DropTarget`...
EXT 2.0项目源代码的分享为开发者提供了一个深入了解EXT框架内部工作原理和最佳实践的机会。 在EXT 2.0源代码中,我们可以看到以下关键知识点: 1. **组件系统**:EXT的核心在于其强大的组件模型,这些组件可以...
通过逐个分析和运行这些例子,读者可以逐步掌握Ext JS的编程技巧,理解其实现原理,并能够灵活运用到实际项目中。此外,这些代码也是学习Ext JS API的好资料,读者可以通过阅读源码,了解组件的配置选项、事件处理和...
每个示例的源码都可以帮助你深入学习EXT的API,掌握如何编写和组织代码以实现所需功能。 总结来说,EXT examples是一个宝贵的资源,为学习和实践EXT提供了丰富的实例。通过研究和实验这些例子,开发者能够快速掌握...
EXT提供了丰富的组件库,包括数据绑定、布局管理、拖放支持等功能,使得开发者能够创建出交互性强、用户体验良好的Web应用。EXT的学习对于想要深入JavaScript前端开发的人来说非常重要。 "有利于EXT学习的小程序"是...
1. **源码分析**:EXT源码提供了深入学习EXT框架的机会。通过阅读源码,开发者可以了解EXT内部的工作机制,例如事件处理、组件创建、布局管理等。这对于调试、优化和扩展EXT应用至关重要。 2. **API文档**:EXT的...
7. **拖放功能**:EXT JS支持拖放操作,可以方便地实现组件之间的交互和数据转移。 8. **国际化支持**:EXT JS 3.2.0版本可能会提供更好的国际化支持,便于开发多语言应用。 9. **主题定制**:EXT JS允许开发者...
EXT 3.2源码分析 EXT JS是一个流行的JavaScript库,专为构建富客户端Web应用程序而设计。EXT 3.2版本是EXT JS历史上的一个重要里程碑,它包含了许多功能改进和性能优化。深入理解EXT 3.2的源码对于开发者来说至关...
EXT中文手册.doc是EXT的中文版手册,文档可能包含了EXT的基本概念、组件介绍、布局管理、数据绑定、事件处理、AJAX通信、拖放操作、图表和表格等核心内容。通过阅读这份文档,开发者可以学习如何使用EXT来创建复杂的...
EXT 2.0的源码分析可以帮助我们深入理解其内部工作原理,提升开发效率和代码质量。 1. **EXT 2.0的核心架构** EXT 2.0基于MVC(Model-View-Controller)设计模式,通过分离业务逻辑、数据和用户界面,使代码更易于...
Ext JS还支持数据绑定、模板引擎、拖放操作、动画效果等高级功能,使得Web应用的交互性和用户体验得到显著提升。 ### 学习资源网站分析 #### http://www.family168.com/tutorial/extdoc/html/extdoc.html 这个...
2. **数据可视化**:Oozie作业通常涉及大量数据处理,EXT2.2的图表组件可以帮助可视化作业状态和性能指标,使分析和问题排查更为直观。 3. **交互性**:通过EXT2.2的事件处理和数据绑定,用户可以直接在界面上进行...
除了基础内容外,《深入浅出Ext JS第2版》还可能覆盖了一些高级特性,如动画效果、拖放功能、图表绘制等。这些特性的实现往往需要开发者具备一定的JavaScript 基础知识。 #### 6. 实战案例分析 为了帮助读者更好地...
Ext.NET控件适合用于创建复杂的Web应用,如企业级管理系统、数据分析仪表盘、实时数据监控系统等,尤其在需要高度定制化用户界面和大量数据交互的场景下。 总的来说,Ext.NET控件是.NET开发者构建现代、功能丰富的...
在Ext Tree中,你可以定义节点模型(model)、节点数据(data)、以及节点的行为(如展开、折叠、拖放等)。同样,"extdemo"可能包含了如何创建、配置和操作Tree的实例代码。 在"extdemo"中,这两个组件可能被结合...
EXT 4.1的GridHeader支持列的拖放操作,用户可以自由调整列的顺序,以满足个性化查看数据的需求。开发者可以通过监听`columnmove`事件来处理列移动的逻辑。 7. **样式与模板** GridHeader允许开发者自定义样式和...
EXT2.0中文教程主要针对的是那些对EXT库感兴趣的初学者和希望深入理解EXT的人群。EXT是一个强大的JavaScript库,特别适用于构建富互联网应用程序(RIA)。EXT2.0是其一个重要版本,它提供了丰富的组件、数据绑定机制...
这个官方实例包提供了丰富的示例和代码片段,帮助开发者深入理解并掌握Ext3.0的使用方法。下面将详细介绍Ext3.0的核心特性、关键组件以及如何通过提供的实例进行学习。 一、Ext3.0核心特性 1. 基于组件的架构:Ext...
3. **实现方式**: 要实现`Ext.TabPanel`的拖放功能,开发者通常需要集成EXT JS的拖放插件,如`Ext.dd.DD`或`Ext.dd.DDProxy`。这些插件提供必要的事件监听和处理,以响应用户的拖放操作。同时,可能还需要自定义事件...
深入浅出Ext JS(第2版)是一本深入解析这个框架的专业书籍,其随书光盘源码提供了丰富的示例代码,帮助读者更好地理解和应用Ext JS的核心概念和技术。由于PDF文件过大无法直接上传,这里我们主要关注光盘源码中的内容...