- 浏览: 65029 次
- 性别:
- 来自: 长沙
最新评论
-
hyj1254:
说得好啊..
什么是个人核心竞争力 -
hehaibo_job:
楼主,数据库脚本怎么都没啊
Jfreechat实例 -
dazui521:
感动,我找了好久才找到这么好的例子
Jfreechat实例 -
dazui521:
...
Jfreechat实例
终于完成了全文的翻译,由于时间比较参促,文章没有过多的校正与润色,阅读过程中难免会有些许生硬或不准确的感觉,请大家见量并指出,方便他人阅读。
原文作者将拖放功能的实现分步讲解,其核心的地方在于移动和放置元素时,鼠标、移动元素、目标元素关系的处理,只要这个问题处理好了,代码就很容易理解,译文仅供辅助参考之用。
整合所有的功能
最后我们使用所有代码片断,来创建一个完整的拖放函数脚本。我们所要做的第一件事情是DOM操作,如果你对此并不十分熟悉,可以阅读《 JavaScript Primer on DOM Manipulation 》。
接下来的代码创建容器和容器组,使得在这些容器中可以拖动每个元素,这在本文第二个demo的基础上来完成。这段代码能够用来重新规划元素的顺序,将导航窗口放在页面的左侧或右侧,或再加入你所能想到的其他的功能。
我们将使用伪代码来一步步进行讲解,将真实的代码通过注释的方式留给读者查看。
1.当文档第一次被加载时,我们创建一个名为dragHelper的DIV标签,当我们开始移动一个元素的时候,dragHelper将成为一个隐藏元素,可以四处移动。真实的元素并不会被拖动,仅仅使用insertBefore和appendChild来移动。我们在开始的时候隐藏dragHelper。
2.我们创建mouseDown和mouseUp函数。起初,所有的这些函数都假设记录了鼠标按钮的状态,以至于iMouseDown变量在鼠标按下的时候为true,没有按下的时候为false。
3.我们创建一个全局变量DragDrops,以及一个函数CreateDragContainer。DragDrops包含一组相互关联的容器。传入CreateDragContainer的任何变量(代表容器)被组织成一个新的集合,使元素能够在这些容器间自由移动。通过setAttribute,CreateDragContainer函数同样将各容器中的元素绑定在一起。
4.现在我们的代码知道每个元素所在的集合,现在来看mouseMove函数。mouseMove函数首先设置了一个变量target,表示鼠标下面的目标元素,如果这个元素在集合(用getAttribute判断)中就继续下面操作:
4.1.首先,在必要的时候,我们运行一个简单的脚本来改变目标元素的class属性,这样就创造了一个翻动的效果。
4.2.然后我们检查鼠标是否点击(因为我们的代码已经运行到这里),如果事件发生:
4.2.1.设置变量curTarget为当前元素。
4.2.2.记录元素当前在文档中的位置,以便在需要的时候可以将它的值取回。
4.2.3.将当前元素克隆到dragHelper,使得我们能够移动元素的隐藏备份。
4.2.4.因为在dragHelper中我们完全拥有了拖动元素的一个备份,这个元素会始终在鼠标下,我们必须移除dragObj属性,让代码知道dragObj已不在集合中。
4.2.5.我们快速记录集合中每个元素当前的位置、宽度和高度。当元素第一次开始被拖动时,我们仅需做一次这种工作,否则每当鼠标移动的时候我们都必须做一次,甚至一秒内几百次。
4.3.如果鼠标没有点击,要么我们和之前拥有同样的目标元素,要么没有目标元素,不论哪种情况我们都不会做任何事情。
5.现在我们检查curTarget变量。curTarget应该仅包含一个被拖动的对象,因此如果它存在,表示我们正在拖动一个元素:
5.1.移动隐藏DIV到鼠标,这个元素和文章前面所创建的元素一样能够被拖动。
5.2.然后我们检查鼠标是否存在于当前集合中每个容器中。
5.2.1.如果鼠标在某个容器中,我们检查容器中的每个元素,查看我们正拖动的元素属于哪个位置。
5.2.2.然后我们将所拖动的元素放置在容器中另一个元素的前面,或容器的最后位置。
5.2.3.最后我们确定元素可见。
6.剩下的事情就是捕获mouseUp事件:
6.1.首先需要隐藏dragHelper:它不再被需要,因为我们没有拖动任何东西。
6.2.如果拖动的元素是可见的,它已经存在于任何它所属的容器中,所有工作已完成。
6.3.如果拖动的元素不可见,我们将它放回它原来所在的地方。
原文作者将拖放功能的实现分步讲解,其核心的地方在于移动和放置元素时,鼠标、移动元素、目标元素关系的处理,只要这个问题处理好了,代码就很容易理解,译文仅供辅助参考之用。
整合所有的功能
最后我们使用所有代码片断,来创建一个完整的拖放函数脚本。我们所要做的第一件事情是DOM操作,如果你对此并不十分熟悉,可以阅读《 JavaScript Primer on DOM Manipulation 》。
接下来的代码创建容器和容器组,使得在这些容器中可以拖动每个元素,这在本文第二个demo的基础上来完成。这段代码能够用来重新规划元素的顺序,将导航窗口放在页面的左侧或右侧,或再加入你所能想到的其他的功能。
我们将使用伪代码来一步步进行讲解,将真实的代码通过注释的方式留给读者查看。
1.当文档第一次被加载时,我们创建一个名为dragHelper的DIV标签,当我们开始移动一个元素的时候,dragHelper将成为一个隐藏元素,可以四处移动。真实的元素并不会被拖动,仅仅使用insertBefore和appendChild来移动。我们在开始的时候隐藏dragHelper。
2.我们创建mouseDown和mouseUp函数。起初,所有的这些函数都假设记录了鼠标按钮的状态,以至于iMouseDown变量在鼠标按下的时候为true,没有按下的时候为false。
3.我们创建一个全局变量DragDrops,以及一个函数CreateDragContainer。DragDrops包含一组相互关联的容器。传入CreateDragContainer的任何变量(代表容器)被组织成一个新的集合,使元素能够在这些容器间自由移动。通过setAttribute,CreateDragContainer函数同样将各容器中的元素绑定在一起。
4.现在我们的代码知道每个元素所在的集合,现在来看mouseMove函数。mouseMove函数首先设置了一个变量target,表示鼠标下面的目标元素,如果这个元素在集合(用getAttribute判断)中就继续下面操作:
4.1.首先,在必要的时候,我们运行一个简单的脚本来改变目标元素的class属性,这样就创造了一个翻动的效果。
4.2.然后我们检查鼠标是否点击(因为我们的代码已经运行到这里),如果事件发生:
4.2.1.设置变量curTarget为当前元素。
4.2.2.记录元素当前在文档中的位置,以便在需要的时候可以将它的值取回。
4.2.3.将当前元素克隆到dragHelper,使得我们能够移动元素的隐藏备份。
4.2.4.因为在dragHelper中我们完全拥有了拖动元素的一个备份,这个元素会始终在鼠标下,我们必须移除dragObj属性,让代码知道dragObj已不在集合中。
4.2.5.我们快速记录集合中每个元素当前的位置、宽度和高度。当元素第一次开始被拖动时,我们仅需做一次这种工作,否则每当鼠标移动的时候我们都必须做一次,甚至一秒内几百次。
4.3.如果鼠标没有点击,要么我们和之前拥有同样的目标元素,要么没有目标元素,不论哪种情况我们都不会做任何事情。
5.现在我们检查curTarget变量。curTarget应该仅包含一个被拖动的对象,因此如果它存在,表示我们正在拖动一个元素:
5.1.移动隐藏DIV到鼠标,这个元素和文章前面所创建的元素一样能够被拖动。
5.2.然后我们检查鼠标是否存在于当前集合中每个容器中。
5.2.1.如果鼠标在某个容器中,我们检查容器中的每个元素,查看我们正拖动的元素属于哪个位置。
5.2.2.然后我们将所拖动的元素放置在容器中另一个元素的前面,或容器的最后位置。
5.2.3.最后我们确定元素可见。
6.剩下的事情就是捕获mouseUp事件:
6.1.首先需要隐藏dragHelper:它不再被需要,因为我们没有拖动任何东西。
6.2.如果拖动的元素是可见的,它已经存在于任何它所属的容器中,所有工作已完成。
6.3.如果拖动的元素不可见,我们将它放回它原来所在的地方。
// iMouseDown represents the current mouse button state: up or down
/**/ /**/ /**/ /*
lMouseState represents the previous mouse button state so that we can
check for button clicks and button releases:
if(iMouseDown && !lMouseState) // button just clicked!
if(!iMouseDown && lMouseState) // button just released!
*/
var mouseOffset = null ;
var iMouseDown = false ;
var lMouseState = false ;
var dragObject = null ;
// Demo 0 variables
var DragDrops = [];
var curTarget = null ;
var lastTarget = null ;
var dragHelper = null ;
var tempDiv = null ;
var rootParent = null ;
var rootSibling = null ;
Number.prototype.NaN0 = function () { return isNaN( this ) ? 0 : this ;}
function CreateDragContainer() {
/**/ /**/ /**/ /*
Create a new "Container Instance" so that items from one "Set" can not
be dragged into items from another "Set"
*/
var cDrag = DragDrops.length;
DragDrops[cDrag] = [];
/**/ /**/ /**/ /*
Each item passed to this function should be a "container". Store each
of these items in our current container
*/
for ( var i = 0 ; i < arguments.length; i ++ ) {
var cObj = arguments[i];
DragDrops[cDrag].push(cObj);
cObj.setAttribute('DropObj', cDrag);
/**/ /**/ /**/ /*
Every top level item in these containers should be draggable. Do this
by setting the DragObj attribute on each item and then later checking
this attribute in the mouseMove function
*/
for ( var j = 0 ; j < cObj.childNodes.length; j ++ ) {
// Firefox puts in lots of #text nodesskip these
if (cObj.childNodes[j].nodeName == '#text') continue ;
cObj.childNodes[j].setAttribute('DragObj', cDrag);
}
}
}
function mouseMove(ev) {
ev = ev || window.event;
/**/ /**/ /**/ /*
We are setting target to whatever item the mouse is currently on
Firefox uses event.target here, MSIE uses event.srcElement
*/
var target = ev.target || ev.srcElement;
var mousePos = mouseCoords(ev);
// mouseOut event - fires if the item the mouse is on has changed
if (lastTarget && (target !== lastTarget)) {
// reset the classname for the target element
var origClass = lastTarget.getAttribute('origClass');
if (origClass) lastTarget.className = origClass;
}
/**/ /**/ /**/ /*
dragObj is the grouping our item is in (set from the createDragContainer function).
if the item is not in a grouping we ignore it since it can't be dragged with this
script.
*/
var dragObj = target.getAttribute('DragObj');
// if the mouse was moved over an element that is draggable
if (dragObj != null ) {
// mouseOver event - Change the item's class if necessary
if (target != lastTarget) {
var oClass = target.getAttribute('overClass');
if (oClass) {
target.setAttribute('origClass', target.className);
target.className = oClass;
}
}
// if the user is just starting to drag the element
/**/ /**/ /**/ /*
lMouseState represents the previous mouse button state so that we can
check for button clicks and button releases:
if(iMouseDown && !lMouseState) // button just clicked!
if(!iMouseDown && lMouseState) // button just released!
*/
var mouseOffset = null ;
var iMouseDown = false ;
var lMouseState = false ;
var dragObject = null ;
// Demo 0 variables
var DragDrops = [];
var curTarget = null ;
var lastTarget = null ;
var dragHelper = null ;
var tempDiv = null ;
var rootParent = null ;
var rootSibling = null ;
Number.prototype.NaN0 = function () { return isNaN( this ) ? 0 : this ;}
function CreateDragContainer() {
/**/ /**/ /**/ /*
Create a new "Container Instance" so that items from one "Set" can not
be dragged into items from another "Set"
*/
var cDrag = DragDrops.length;
DragDrops[cDrag] = [];
/**/ /**/ /**/ /*
Each item passed to this function should be a "container". Store each
of these items in our current container
*/
for ( var i = 0 ; i < arguments.length; i ++ ) {
var cObj = arguments[i];
DragDrops[cDrag].push(cObj);
cObj.setAttribute('DropObj', cDrag);
/**/ /**/ /**/ /*
Every top level item in these containers should be draggable. Do this
by setting the DragObj attribute on each item and then later checking
this attribute in the mouseMove function
*/
for ( var j = 0 ; j < cObj.childNodes.length; j ++ ) {
// Firefox puts in lots of #text nodesskip these
if (cObj.childNodes[j].nodeName == '#text') continue ;
cObj.childNodes[j].setAttribute('DragObj', cDrag);
}
}
}
function mouseMove(ev) {
ev = ev || window.event;
/**/ /**/ /**/ /*
We are setting target to whatever item the mouse is currently on
Firefox uses event.target here, MSIE uses event.srcElement
*/
var target = ev.target || ev.srcElement;
var mousePos = mouseCoords(ev);
// mouseOut event - fires if the item the mouse is on has changed
if (lastTarget && (target !== lastTarget)) {
// reset the classname for the target element
var origClass = lastTarget.getAttribute('origClass');
if (origClass) lastTarget.className = origClass;
}
/**/ /**/ /**/ /*
dragObj is the grouping our item is in (set from the createDragContainer function).
if the item is not in a grouping we ignore it since it can't be dragged with this
script.
*/
var dragObj = target.getAttribute('DragObj');
// if the mouse was moved over an element that is draggable
if (dragObj != null ) {
// mouseOver event - Change the item's class if necessary
if (target != lastTarget) {
var oClass = target.getAttribute('overClass');
if (oClass) {
target.setAttribute('origClass', target.className);
target.className = oClass;
}
}
// if the user is just starting to drag the element
发表评论
-
Struts 源码学习之ActionServlet ( 二)
2008-01-15 16:48 1137Struts 源码学习之ActionServlet ( 二) ... -
Struts 源码学习之ActionServlet ( 一)
2008-01-15 16:46 1142权所有:(xiaodaoxiaodao)蓝小刀 xiao ... -
Jakarta的公共连接池实现 - BasicDataSource
2008-01-10 14:52 6978| Jakarta的公共连接池实现 - BasicDa ... -
DWR
2008-01-03 15:25 1202DWR一个外国人实现的很有前途的AJAX框架。 多余的话就不说 ... -
用dwr封装表单项提交表单
2008-01-02 16:26 4013首先,配置dwr环境,网上很多资料都说得很详细,这里就不写了。 ... -
Java Reflection (JAVA反射)详解
2008-01-02 15:06 995Reflection是Java 程序开发语言的特征之一,它允许 ... -
DOM 解析
2008-01-02 09:30 1072To read and update, create and ... -
hql0
2007-12-29 14:07 854HQL语句。(已更新)2007年06月04日 星期一 18:2 ... -
Hql
2007-12-29 13:54 1113Hib的检索方式 1'导航对象图检索方式。通过已经加载的对象, ... -
翻页例子
2007-12-29 09:38 866个MS SQLServer7数据库 DNS ... -
在JSP中访问数据库大全
2007-12-29 09:33 810这种把数据库逻辑全部放在jsp里未必是好的做法,但是有利于初学 ... -
jsp 调用sql server数据源
2007-12-29 09:31 1283import java.sql.*; import java. ... -
转:j2ee中DAO设计模式
2007-12-26 17:11 944最近参与WEB编程项目,采用STRUTS框架,在处理到数据持久 ... -
getAttribute和getParameter的区别
2007-12-26 14:42 2415getAttribute是取得jsp中 用setAttribu ... -
xml dom 教程
2007-12-26 14:31 809http://61.139.52.111:8090/kj/Ma ... -
在网页中引入其它html页面的几种方法
2007-12-26 11:30 47401.IFrame引入,看看下面的代码 <IFRAME N ... -
Tomcat 的数据库连接池设置与应用(Mysql篇)
2007-12-17 17:24 15131.将数据库驱动程序的JAR文件放在Tomcat的 commo ... -
Tomcat+Mysql连接池
2007-12-17 15:25 2499Tomcat+Mysql连接池2006年10月06日 星期五 ... -
tomcat+mysql
2007-12-17 15:23 972安装tomcat+mysql2007-12-02 19:461 ... -
如何在 JavaScript 中实现拖放(上)
2007-08-18 17:48 879JavaScript擅长于修改页面中的DOM元素,但是我们使用 ...
相关推荐
通过本文的介绍,你应该能够理解拖放API的基本概念,掌握在JavaScript中实现拖放功能的方法,并能够在实际项目中应用这一API来实现动态交互。这将有助于你构建更加动态和交互式的Web应用,为用户提供更加丰富的体验...
在本文中,我们将探讨拖放的基本原理以及如何使用JavaScript实现这一功能。 首先,拖放功能的核心在于浏览器提供的`HTML5 Drag and Drop API`,它允许开发者定义拖动源(drag source)、放置目标(drop target)...
通过以上介绍可以看出,在HTML5中实现拖放效果无需编写额外的JavaScript代码。仅通过简单的HTML标记和CSS样式即可完成基本的拖放功能。这种方式不仅简化了开发流程,而且提升了页面性能。不过需要注意的是,虽然...
这个API使得在浏览器环境中实现拖放功能变得更加简单和标准化。它提供了`dragstart`、`drag`、`dragenter`、`dragover`、`dragleave`、`drop`和`dragend`等一系列事件,帮助开发者监听和处理拖放过程的各个阶段。 1...
在MooTools 1.2中,`Drag.Move`是用于实现拖放功能的一个强大类,它扩展了基础的`Drag`类,使得元素不仅能够被拖动,还能在特定的可接受元素(droppables)之间进行移动。 `Drag.Move`的基本用法涉及创建一个新的...
下面将详细探讨如何在ASP.NET中实现拖放操作。 首先,了解HTML5的拖放API是关键。HTML5引入了`draggable`属性,使得任何HTML元素都可以被拖动。同时,通过监听`dragstart`、`drag`、`dragend`等事件,可以实现拖动...
在你的网页上实现拖放的效果并不是很复杂。首先,我们知道鼠标的位置,然后我们需要了解用户什么时候点击一个元素,以至于我们知道要准备开始拖动它,最后我们要移动这个元素。 捕获鼠标的移动 第一步,我们需要...
以下将详细讲解如何利用JavaScript实现拖放效果的关键步骤和涉及的技术。 首先,理解拖放的基本流程至关重要。拖放操作通常包括以下几个阶段: 1. **监听鼠标按下(mousedown)**:当用户点击可拖动元素时,我们...
在本压缩包文件中,我们可能找到了一个简易而灵活的JavaScript拖放框架的源代码或者相关文档,这将有助于我们理解并快速实现拖放功能。 拖放功能的核心在于以下几点关键技术: 1. **数据Transfer对象**:在拖放...
在Vue.js中实现拖放功能,首先我们需要配置项目数据。创建一个包含项目的`items`数组,每个项目都有唯一的`id`、显示文本`title`以及所属的列表`list`。例如: ```javascript data() { return { items: [ { id: ...
HTML5引入了拖放功能,使得在浏览器中实现拖放操作变得可能。主要涉及的事件包括`dragstart`、`dragenter`、`dragover`、`dragleave`、`drop`和`dragend`。在`index.html`文件中,我们需要创建一个可拖放区域,通常...
在`dragsvg.html`中,开发者可能使用了原生JavaScript或者SVG事件监听器来实现拖放功能。SVG元素拥有`dragstart`、`drag`和`dragend`等事件,通过绑定这些事件处理函数,可以控制SVG图形在用户的鼠标操作下移动。...
在这个"可以实现拖放的JS代码"中,我们将探讨如何使用纯JavaScript实现拖放功能。 首先,我们需要了解HTML5引入的拖放API。这个API提供了一系列的事件和接口,使得在网页上实现拖放操作变得相对简单。关键的事件...
在Web开发中,使用JavaScript实现拖放效果可以增加页面的交互性,改善用户体验。本文将详细介绍使用JavaScript实现拖放效果的核心知识点和基本原理。 首先,要实现拖放功能,需要使用到几个关键的DOM事件:...
javascript 实现div区域拖放
"JavaScript_拖放太简单了,很伤人.zip"这个文件名暗示了一个关于JavaScript实现拖放功能的教程或者示例代码库,可能是作者在尝试或教学过程中发现其比预期的更易上手,从而产生了“伤人”的趣味说法。 拖放功能在...
AJAX(异步JavaScript和XML)技术常被用于在不刷新整个页面的情况下与服务器交换数据,这在动态加载或保存日历事件时非常有用。此外,JSON(JavaScript Object Notation)格式通常是传输数据的首选,因为它与...
本文实例将介绍如何使用纯JavaScript实现多种拖放效果,包括触发对象、设置范围限制、指定容器大小以及水平和垂直锁定等。 首先,我们需要了解一下JavaScript中的事件处理。在示例代码中,`addEventHandler` 和 `...
dataTransfer对象用于从被拖动元素向放置目标传递字符串数据。因为这个对象是 event 的属性,所以在拖放事件的事件处理程序外部无法访问 data...在事件处理程序内部,可以使用这个对象的属性和方法实现拖放功能。