原文来自:
http://www.cainiao8.com/web/js_examples/14_tuozhuai2.html
上一节我们实现了基本的拖拽,但是需要给可拖拽的元素设置一个特定的id,然后再在JS中修改代码,使用起来比较麻烦。这样一旦文档结构发生变化就要调整JS代码,没有做到JavaScript与HTML分离的原则。
所以应该实现一个可以适用于多个元素的拖拽代码,而且代码在可拖拽元素改变后应该不需要修改而仍然能正常工作。
使用class做“钩子”
为了使代码适用于多个元素,我们使用它的class来指定元素是否可以拖拽。我们使用如下的JavaScript代码来遍历文档中所有的节点,然后让class为drag的元素可以被拖拽。
function dragInit(node){
if(node.className == "drag"){
node.onmousedown = down;
node.onmousemove = move;
node.style.position = "relative";
node.style.top = "0px";
node.style.left = "0px";
}
var children = node.childNodes;
for(var i = 0;i < children.length; i++){
dragInit(children[i]);
}
}
dragInit函数会逐个检查各个节点的class是否为drag,如是是,那么会为该元素设置鼠标经过、鼠标按下事件的响应函数。
多个元素一起移动的问题
上面我们已经实现了多个元素可移动的问题。可以进入这个网页测试一下。可以发现这个拖拽效果有一个严重的问题。当我们拖动div1的时候,如果鼠标路径经过了div2,那么两个div会同时移动。原因是这触发了 div2的onmouseover事件。我们可以通过给元素设置z-index的方法来解决。因为当我们拖动z-index较高的元素经过z-index 较低的元素时并不会触发z-index较低元素的鼠标经过事件。所以我们对代码做出如下修改:
<script type="text/javascript">
var max = 1;//定义一个max变量
……其它部分不变
function down(event)
{
……
//保证点击元素的z-index最高
this.style.zIndex = max++;
}
</script>
我们设置了一个max变量来记录当前的z-index值,当点击一个元素的时候就用max的值来设置它的z-index属性,同时max的值会变大。这样就实现了每次拖拽一个元素的时候,不会触发其它元素的mouseover事件。但是,
我们发现,当拖动元素的速度非常快的时候,仍然会造成两个元素一起移动。我个人认为这是浏览器处理事件的延迟造成的。通过给每个对象分别设置一个判断拖拽状态的布尔变量dragging就可以解决这个问题了。最终的代码如下:
拖拽JavaScript代码
<script type="text/javascript">
var dragging = false;
var mouseY;
var mouseX;
var max = 1;
function dragInit(node){
if(node.className == "drag"){
node.onmousedown = down;
node.onmousemove = move;
node.onmouseover = over;
node.onmouseup = up;
node.style.position = "relative";
node.style.top = "0px";
node.style.left = "0px";
node.dragging = false;
}
var children = node.childNodes;
for(var i = 0;i < children.length; i++){
dragInit(children[i]);
}
}
window.onload = function(){
dragInit(document);
document.onmouseup = docUp;
}
function down(event)
{
event = event || window.event;
dragging = true;
this.dragging = true;
mouseX = parseInt(event.clientX);
mouseY = parseInt(event.clientY);
objY = parseInt(this.style.top);
objX = parseInt(this.style.left);
this.style.zIndex = max++;
}
function move(event){
event = event || window.event;
if(this.dragging == true && dragging == true){
var x,y;
y = event.clientY - mouseY + objY;
x = event.clientX - mouseX + objX;
this.style.top = y + "px";
this.style.left = x + "px";
}
}
function up(){
this.dragging = false;
}
function docUp(){
dragging = false;
}
function over(){
this.style.cursor = "move";
}
</script>
做出修改的代码用已经标记了出来。
点击进入示例网页。
JavaScript拖拽系列
1. JavaScript拖拽
2. JavaScript拖拽2——多元素、分离JS
3. JavaScript拖拽3——解决快速拖拽的问题
4. JavaScript拖拽4——获得元素的位置
5. JavaScript拖拽5——性能优化
6. JavaScript拖拽6——修复错误
分享到:
相关推荐
此外,随着Node.js等技术的发展,JavaScript也越来越多地应用于后端开发领域,进一步拓宽了其应用场景。 总之,JavaScript是一门非常实用且功能强大的语言,它不仅能够提升网页的用户体验,还能极大地扩展Web应用的...
#### 二、专业JavaScript开发 这部分深入探讨了面向对象编程在JavaScript中的应用,以及如何创建可重用的代码。 ##### 2.1 语言特性 - **引用**:JavaScript中的变量可以引用对象或数组,而不是直接存储值。 - **...
### Qt4.6——白皮书:跨平台GUI应用程序开发框架详解 #### 一、引言 ##### 1.1 执行摘要 Qt是著名的跨平台C++应用程序框架,其核心理念是“编写一次,到处编译”,允许开发者在单一源代码库的基础上,轻松为多个...
这个项目提供了一个实际应用jQuery技能的机会,同时涉及到前端开发中的布局设计、事件处理、动画效果和用户交互等多个方面,对于提升JavaScript和前端开发技能有着显著的帮助。通过学习和实践,开发者不仅可以掌握...
7. **用户界面设计**:ASP.NET中的Web Forms允许开发者使用拖放控件的方式创建用户界面,而CSS和JavaScript可以用来实现更丰富的交互效果和美化界面。 8. **调试与部署**:ASP.NET提供了强大的调试工具,帮助开发者...
3. **页面元素动画**:利用CSS3动画和JavaScript库(如jQuery)实现平滑的元素移动、缩放、旋转等效果。 4. **响应式设计**:结合CSS媒体查询,使网页能根据设备屏幕尺寸自适应调整布局。 5. **拖放功能**:实现用户...
【DIV+CSS网页设计效果2】这一主题涵盖了网页设计中的核心元素——布局和样式,以及与之相关的JSP动态网页技术。在这个专题中,我们将深入探讨如何利用DIV和CSS实现高效的网页布局,以及如何结合JSP来提升网页的交互...
框架还提供了控件模型,允许通过拖放方式在页面上创建和配置用户界面元素,极大地简化了开发流程。 Zealot Forums v1.0.0可能包含以下关键组件: 1. 数据库设计:论坛通常需要存储用户信息、主题、帖子、分类等...
**DHTML中文手册——前台开发者的知识宝典** DHTML(Dynamic HTML)是一种在网页上创建动态、交互性内容的技术,它结合了HTML、CSS、JavaScript以及DOM(Document Object Model)来实现页面的动态更新,而无需重新...
【ASP.NET 源码分析——IdioBlog (NClay) 源码详解】 ASP.NET 是微软推出的一种用于构建动态网站、Web 应用程序和服务的开发框架。它基于.NET Framework,提供了丰富的功能和易用性,使得开发者能够快速高效地构建...
总的来说,“mission:用 node.js 和 angular.js 编写的待办事项应用程序”是一个典型的前后端分离的Web开发实例,展示了JavaScript全栈开发的强大能力,对于学习和实践Web开发的开发者来说,这是一个很好的实战项目...
在这个作品集中,JavaScript可能被用来实现动态效果,如页面滚动时的导航高亮、模态对话框、轮播图或者表单验证等功能。同时,它也可以与HTML5的API结合,如WebSocket实现实时通信,或者Web Storage处理客户端数据...
QML允许开发者通过简单的JSON-like语法定义界面元素,如按钮、文本框等,并可以通过JavaScript实现逻辑控制。这种分离视图和逻辑的方式极大地提高了开发效率,尤其是对于UI设计者和开发者之间的协作。 在Qt Quick中...
7. **丰富的插件生态系统**:社区提供了大量的插件,可以帮助开发者快速实现各种功能,如表单验证、拖放效果等。 **jQuery** 的设计不仅改变了编写JavaScript代码的方式,也降低了使用JavaScript操作网页的复杂度,...
5. **XAML语言**:XML标记语言XAML用于定义Silverlight应用的UI布局和样式,使得设计和代码分离,便于维护和扩展。 【描述】中的"Silverlight及Blend的电子教学文档",暗示了另一个工具—— Blend。 Blend是微软的...
HTML5引入了许多新特性,如语义化标签(如、、等)、离线存储、拖放功能、媒体元素(音频和视频)的内置支持以及改进的数据输入控件。在这个图书查询借阅网站中,HTML5被用来构建用户友好的界面,提供更丰富的交互性...
通过使用Ext-Desktop,开发者可以快速构建出具有多窗口、拖放功能、系统托盘等桌面应用特点的Web应用。 标签"Ext,java"表明了这个项目与两种技术紧密相关。ExtJS是JavaScript库,但它的许多功能依赖于后端服务器的...
**Qt Assistant——版权所有** Qt Assistant 是一个强大的文档查看器,是Qt开发环境中不可或缺的一部分,尤其对于初学者来说,它是理解和掌握Qt库的关键工具。它提供了详细的API文档,帮助开发者快速查找并理解Qt类...
随着Web技术的发展,HTML5引入了许多新特性,如本地存储、拖放功能、离线应用、新的媒体元素(如`<audio>`和`<video>`)以及更多的表单控件等,大大增强了Web应用程序的能力。同时,HTML5也提高了对移动设备的支持,...