五步掌握Ext的拖放(上)

五步掌握Ext的拖放
5 Steps to Understanding Drag and Drop with Ext
JS

September 13, 2009 by Jay Garcia 翻译:frank

那么多的交互设计模式中,“拖放(Drag and
Drop)”模式是开发者感觉比较不错的。用户日常在进行拖放操作的时候,真的是想都不用想地就可以轻松搞掂了,易学易用,非常直观。下文中,不是我们断言,只要将下面五个步骤的要义领会在心,拖放不再是一件难事。

定义拖放

拖动(drag)的动作,就是鼠标的点击动作发生了,点击在某些UI元素身上,就可以按着不放,同时也可以移动着鼠标;放下(drop)的动作,就是在拖动动作开始后,但鼠标按钮松开了——就是放下的动作。

宏观而言,拖放的操作可用下面的流程图来描述。

 

为加速开发,Ext JS本来就提供了 Ext.dd
以实现拖放的支持。在本博文中,我们将围绕拖放行动的“触发、无效置下和成功置下”的这几个方面问题,以及其中事件消息编程,还有修改外观的问题进行讨论。

拖放类的组织构成

初涉Ext.dd的文档部分大家觉得会有些怕怕的,但是,如果我们稍加一点耐心去观察其中的源码,那么我们会发现许多类都继承于DragDrop
类,并由此分为“Drag拖动的”和“Drop置下的”这两大类别。分类所针对的对象就是单个或多个节点其拖放的行为模式,——从类的组织来看可以看到这样的结果。

 

我们打算从最简单的DOM节点单个拖放的知识点来展开讨论,为的是更好地降低的学习曲线,适合初学者。切入正题,那就是分别利用DD
DDTarget
类扩展出基本的自定义拖放行为。

然而,我们必须先介绍一下例程以及例程的目标是如何。

话说这个例子……

假设有这样的一个需求,客户是一个间汽车出租公司,出租cars小汽车和trucks卡车。他希望这些汽车有三种状态可选择:available可用的、rented已出租的、in
repaire处于维修中的。作为类别划分,cars和trucks分别只能在其所属的“available”容器中。

一开始,第一目标是使得cars和trucks“可拖动”的状态,对此我们将会使用DD
;第二,我们要让rented
repair

vehicle
作为“可投放(可置下)”的目标地方,对此我们将会使用DDTarget
。最后,我们将安排两个拖放组(drag drop
groups)把小车和卡车区分开来,各自属于不同的“available”投放容器就不会相互搞错。

这个例程的HTML和CSS已经做好,可以在这儿
下载。下载后,就可以开始拖动这些小车和卡车的操作了。

第一步:开始拖动

要使得汽车所在的DIV可拖动,得先要获取这些DIV集合。获取后,集合是一个数组,我们遍历它以此建立DD
实例。下面源码是该步骤的过程。

// 创建一个重写拖动行为的对象,稍后再试。
var overrides = {};
// 配置cars可拖动的
var carElements = Ext.get('cars').select('div');
Ext.each(carElements.elements, function(el) {
var dd = new Ext.dd.DD(el, 'carsDDGroup', {
isTarget : false
});
// 复制overrides对象到刚刚创建的DD实例
Ext.apply(dd, overrides);
});

var truckElements = Ext.get('trucks').select('div');
Ext.each(truckElements.elements, function(el) {
var dd = new Ext.dd.DD(el, 'trucksDDGroup', {
isTarget : false
});
Ext.apply(dd, overrides);
});

所有的拖放类其参与的模式皆是“方法重写(methods
overridings)”。上述声明了一个空的overrides的对象,以待后面安排的动作方法,就覆盖到这个对象身上。这就是强调代码签名(code
segment)的原因。

欲查询cars容器中的全体子div元素,我们可使用DomQuery
选取元素的函数。

要让cars和trucks元素变为可拖动的(dragable),我们创建了新的DD
实例,所传入的参数就是cars和trucks的DOM元素,还有说明其所隶属于的拖放组,也就是说小汽车应对应着小汽车拖放组、卡车应对应着卡车拖放组。拖放组(group)是什么呢?先买个关子,——等下我们便知道拖放组怎么设置有多重要了,特别在定义rented

repair
置下目标的时候。

注意我们重写DD
对象的时候使用了Ext.apply
,这是一个增加对象的属性或方法的函数,十分方便。

在继续下一步之前,我们得花点时间分析一下拖动元素时屏幕将会发生些什么,进而明白所以然之后才会对接下来的代码在理解上,游刃有余。

说说拖动的元素怎么个拖动法

先要说明的是,当移动car或truck的时候,移到哪就摆放在哪,因为我们例子是一步一步来,从简单到复杂,所以这时候的例子正是纯粹的“拖动(drag)”,也就是说我们把拖放的过程从中拆分了。那么移动或拖动到某个目的地是不是就是一个合法之目的地,符不符合我们程序限定之要求呢?这就是有效置下和无效置下的区别了。相对地,我们仅此理解了“无效置下(invalid
drop)”即可清楚有效置下的逻辑。

下面插图来自FireBug
的HTML检测面板,通过高亮的效果告知正在拖动的div元素,即Camaro元素(估计某个汽车品牌)。

 

点击上面的图片
测试拖动操作。.

注意观察拖动的过程中,我们看到元素底下的style样式属性有了三个新的CSS值:position、top和left,其中定义position为相对位置relative便可以将元素在页面上移来移去。移到的同时,top、left的数值也在变化,不断更新(此二值为元素的参照坐标)。由此可见,拖动的原理就在于定义这三项值的问题上。

拖动手势完成之后,style属性仍保持不变,当然再拖动的话,style又会新变化,但按道理来说,我们应该不是这样,而是在无效drop的状态下令元素回到原来的位置。在设置好合法置下目标之前,任何置下动作都可被认为是无效的drop。

第二步:修复无效置下

修复无效的drop,其实就是让拖动了的元素“归位”。怎么个“归位”法?既然前面修改了元素的style样式,那么“归位”就是恢复style为拖动之前的数值。最简单的制作方法,便是在鼠标按钮松开的事件触发后,拖动着的那个元素马上消失,然后在原来的位置重新出现。照这样简单的做法不是不行,就是显得比较生硬,最好还是用Ext.Fx
产生出渐变的过程,为求整个过程显得平滑一些。

提一提哪些方法我们要重写的repair方法:b4StartDrag
, onInvalidDrop

endDrag。

对overrides对象加入下列的方法。

// 获取在拖动的那个元素
b4StartDrag : function() {
// Cache the drag element
if (!this.el) {
this.el = Ext.get(this.getEl());
}

// 先记下原始坐标,后面有用
this.originalXY = this.el.getXY();
},
// 不在一个拖放组里面的就是无效drop
onInvalidDrop : function() {
// Set a flag to invoke the animated
repair
this.invalidDrop = true;
},
// 拖动操作结束后执行
endDrag : function() {
// 无效置下真正的逻辑
if (this.invalidDrop === true) {
// Remove the drop invitation
this.el.removeClass('dropOK');

// 定义动画的配置项对象
var animCfgObj = {
easing : 'elasticOut',
duration : 1,
scope : this,
callback : function() {
// Remove the position attribute
this.el.dom.style.position = '';
}
};

// 应用动画
this.el.moveTo(this.originalXY[0], this.originalXY[1], animCfgObj);
delete this.invalidDrop;
}

},

首先是b4StartDrag
方法。顾名思义,它开始拖放前被调用。某种程度上也是一个事件。它的作用是记下元素原来的XY坐标,也就是被拖动前的位置。归位的时候就凭着这个坐标;其次endDrag
则是一个无效置下invalidDrop的通知方法。无效drop前面已经说过了,表示在不同一个DD组的区域投放,通通视作无效的投放。这里只是设置实例属性invalidDrop
为true,简单地标识一下;最后一个重写的方法endDrag
,每一次结束拖动的时候都会调用,此时元素不能通过鼠标的控制进行拖动了。如果不是成功地到达目的地,应该根据XY的坐标回到原来的位置。该例子中我们采用了elasticOut
的动画美化一下效果。

 

点击上面的图片
就可以演示动画修饰过的修改过程。

OK,修复drop的过程就到此完成了。接下来的步骤是 创建置下对象,相当于“目的地、目标(drop
target)”,形成置下的接纳点,并定义有效地置下过程。

欲知完整DD教程,请看下回分解

时间: 2024-10-16 00:26:11

五步掌握Ext的拖放(上)的相关文章

五步掌握Ext的拖放(下)

接上篇URL:http://blog.csdn.net/zhangxin09/archive/2010/05/03/5551665.aspx . 第三步:设置置下目标 明确需求是怎么样的:除了 rented 和repair 可接纳拖动元素,cars和trucks本身也是可以的.总之是使用 DDTarget 来负责放下的目标.代码如下: //Instantiate instances of Ext.dd.DDTarget for the cars and trucks container var

中小型模具配件厂商线上运营的五步

中介交易 SEO诊断 淘宝客 云主机 技术大厅 中小型模具配件厂商依靠自身条件,要想在网络上运营起来并不是一件容易的事情.由于模具配件本身的特殊性,模具配件广泛应用在制造领域,模具配件的销售对象是大多数是生产的厂商,而非大众群体.那么怎样让模具配件在网络中得到销售出去?这就需要我们很好去策划和运营.现今,网络营销已成为一种不可忽视的提高产品销量的线上运营模式.我们应该怎样做好模具配件的网络营销呢?在这里结合东莞市长安森煌模具配件厂线上运营方案做出总结,分享出中小型模具配件厂商线上运营的五步. 一

用户研究分析:进行用户研究的五步方法

文章描述:进行用户研究的五步法. 想象一下,这就是你所了解的我:大学毕业,男性,年龄在35-45岁,我有一台Mac book pro,还有一台iphone 5.我通过谷歌的chrome浏览器来上网.我公开使用微博和博客,你可以发现我喜欢巧克力和小狗.我结婚了.开着一辆丰田Corolla.我有着棕色的头发和同样棕色的眼睛.我的信用卡清单显示了我最常预定的酒店和喜欢外出就餐的场所. 如果你的金融理财客户给你提供这些信息,你可以告诉他们为什么我刚打算把我的支票及存款转移到一个新的银行吗?这种情况看起来

胖子:新站seo前的五步进行曲

做一个新站需要时间和耐性.需要自信.优化好结构,就是布局.再专心做好内容,排名不再在神马浮云,胖子为大家总结新站seo前的五步曲. 一.合理的布局关键词.包括目标和长尾词,词的布局直接关系网站的排名和权重,所谓打蛇要打七寸,目标和长尾一定要合理的安排以及服务,因为这些个词是引导蜘蛛和用户进来的. 二.高质量内容.这跟原创是有区别的,不是随随便便自己写的,就算是.高质量的内容是在原创基础上加以修饰及为关键词服务的土壤.可以张冠李戴但一定要相关及可读. 三.千万不要过度优化.过度优化,主要是站内,包

Windows XP个人网络联机防火墙五步搞定

防火墙是一套软件或硬件,可协助保护计算机,使其免于受到黑客和许多计算机病毒的攻击.因此,在将计算机连接上网络前,应该先安装防火墙. 如果你使用的是Windows XP操作系统,就可以使用它内建的网络联机防火墙. 值得注意的是,网络联机防火墙是利用封锁某些类型的潜在有害网络通讯的方式运作,所以,它也会封锁一些有用的网络通讯工作.例如,通过网络共享档案或打印机,即时通信之类的应用程序传输档案,或作为多人游戏的主机等.但我们仍然强烈建议使用防火墙,因为它有助于立即保护你的计算机. 第一步:开启网际网络

用户调研五步高效完成不是梦

  今天分享一个Frog Design(青蛙设计)使用的用研方法,只有5步的研究方法,是一位资深交互设计师提出的,全文后还有相关书籍的推荐,想国庆期间深入研究的各位可以抱走 ( ̄ε(# ̄)☆╰ 昨天一个在做金融的妹纸吐槽用研太难.她让我打开脑洞想一下,这是你知道的客户:男,36岁,本科毕业;有一台MacBook Pro和一部iPhone 5手机,平时会Chrome浏览网页;有微博账号,在上面你会看到他喜欢巧克力和矮脚狗;已婚;座驾是丰田花冠;黑发棕眼;信用卡记录可以看到他最近一次订的酒店的位置和

五步教你识别零闪润眼屏显示器

  随着我们周围的数码设备越来越多,由于使用习惯和设备原因都会对于我们的健康产生影响,有关眼睛视力的保护的讨论也从未停息,眼睛作为人体唯一没有皮肤覆盖的器官,非常容易受到损害,屏幕的好坏与将直接影响眼睛的感受. 海尔在润眼屏幕上的尝试已经到了第三代,这一代的"晶润润眼"屏幕采用了阿尔法黑晶涂层,透光率高达98%,减少光线折射率,降低眼睛的疲劳,将屏蔽波长超过5000MHz以上的有害光波50%以上,让画面更清晰的同时,降低对于皮肤和眼睛的伤害,这一期的学几手就较大家通过五步教你识别润眼屏

企业数据安全必备 教你五步玩转加密

本文讲的是企业数据安全必备 教你五步玩转加密,"棱镜门"事件后,越来越多的企业更关注自身的信息安全,并通过加密等手段来升级自身的防御力.但是临阵磨枪的匆忙部署,往往会使加密项目出现各种问题,反而影响部署进度和效果.不少企业很多企业网管员.IT经理等被上级临时要求在企业准备部署加密,时间上的匆忙和信息的不足,造成很多如缺乏系统规划.产品选型经验不足.部署方案可行性不够等问题出现,其实加密部署有一套详尽规范的流程可学,不如学好这五步,让加密部署效果事半功倍. 企业要卓有成效地部署加密项目,

AJAX--XMLHttpRequest五步使用法

      传统浏览方式和AJAX方式的不同         多数Web应用程序都使用请求/响应模型从服务器上获得完整的HTML页面.常常是点击一个按钮,等待服务器相应,在点击另一个按钮,然后在等待,这样一个反复的过程.                而AJAX是一种创建交互式网页的网页开发技术,其中XMLHttpRequest是核心的内容,它能够为页面中的javascript脚本提供特定的通信方式,从而使页面的javascript脚本和服务器之间形成动态交互的效果,XMLHTTPRequest