效果不错的JavaScript拖拽解决方案

基本思路:

拖拽的基本动作:鼠标左键用于选择拖拽元素,鼠标位置移动用于控制拖拽元素的移动,鼠标释放用于触发拖拽元素放置的代码(这其中可能有成功到达有效区域,也有可能会在无效区域进行鼠标释放)。 我们通过记录鼠标的初始位置,在鼠标释放的时候,检测鼠标的位置是否为有效区域,并允许执行相关事件代码用于完成其它业务逻辑。


下面先让我们看一个示例:(该示例实现了一个类似邮件拖动的过程,从邮件列表向文件夹进行拖动)

Code


这里需要简要介绍一下本脚本的一些公开的接口以及基本的使用。


基本使用规则:


1、使用本脚本首先需要包含__firefox_extension.js,这是一个可以独立存在的脚本,适用于firefox对IE部分功能的扩展。通过《firefox extension》可以了解更多。


2、在保证了跨浏览器的一些特性被支持之后,我们可以引入本文所介绍的drag.js文件了。

3、基本的HTML准备工作。(有待测试所有的元素类型)


4、脚本初始化工作。


a.通过形如var drag1 = new drag();的方式组织一种拖拽效果。这样的方式以利于在同一页面内实现多种不同的拖拽效果。


b.通过drag1.init(beDrags,boxs, enabledExtNotice,enabledConstructor,unabledConstructor) 的方式初始化本拖拽对象。

beDrags:一组存在于页面中的,允许被拖动元素的ID值数组。(例如:邮件列表中的邮件)


box:一组存在于页面中的,允许被放置相应beDrags中元素的ID值数组。(例如:邮件文件夹)

[option]enabledExtNotice:布尔值true/false(默认),用于指示是否允许在拖拽对象的起始位置增加是否位于有效区域的指示。当该值为false时不增加任何提示,否则默认使用文本[OK]与[×]来标识。可以通过指定enabledConstructor和unabledConstructor两个参数来更改这两个标识。

[option]enabledConstructor:返回一个用于表示处于有效区域的元素对象,通常为一个<img>对象,或者是一个<span>对象。具体可以参看下载中的示例代码。function(){return <element>;}


[option]unabledConstructor:返回一个用于表示处于无效区域的元素对象,其性质与enabledConstructor一样,仅仅是出现的时间不同。不要求其与enabledConstructor同时为真。


其它常用属性(更多属性详见代码):

[option]effectAllowed:用于指示被拖动对象的拖拽鼠标样式。其样式内容受限于CSS.cursor的有效属性值。


[option]dropEffect:用于指示被拖动对象位于有效区域内的样式。 其样式内容受限于CSS.cursor的有效属性值。

c. 通过设置各个事件方法,以备在合适的时候执行相应的代码。这些事件包括:


ondragstart:当鼠标刚按下拖动对象时执行该部分代码。

ondrag:当鼠标开始拖动时执行该部分代码。


ondragover:当鼠标拖动对象进入有效区域中时执行该部分代码。

ondragleave:当鼠标拖动对象离开有效区域中时执行该部分代码。


ondragend: 当鼠标释放后时执行该部分代码。

Code


d.一些有用的值(状态与当前对象等):

srcElement:被拖动的对象。

tarElement:当被拖动对象被拖动至有效区域并未释放鼠标时,该值为当前有效区域对象。否则该值为null。

placeholder:当对象在被拖动时,会产生临时的占位符用于记录对象的旧有位置,在鼠标释放后拖拽元素将替换该临时placeholder对象,它既可以用于记录旧有位置,巧妙利用该特性可以将可以实现元素的页面拖动。(通过将placeholder置于目标区域中,即可在最终释放后将拖拽对象放置到placeholder所在位置。)


isOverBox:布尔值true/false,用于指示当前拖动是否在有效区域内部。


isMouseUp:布尔值true/false,用于指示当前鼠标是否处于释放状态。

通过以上四个步骤即可完成对拖拽的全部设置。思路是不是清晰多了呢?

下面就自己动手写一些拖拽的样例吧。


软件下载:
 附件: 您所在的用户组无法下载或查看附件





(文/volnet  出处/博客园)

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [javascript] 的这些文章也感兴趣:

从外部的js文件中获取ASPX页面的控件ClientID
用JavaScript实现浏览器地震效果
John Resig谈TraceMonkey和基于JavaScript的RIA未来
用JS的方法使用列表LI制作的隔行换色
网页对联广告代码效果大全
一行代码生成Google SiteMap
Javascript实例:Select的OnChange()事件
JS CSS打造可拖动的聊天窗口层
javascript表单之间的数据传递
使用JavaScript检测浏览器的相关特性