`
yangsp1
  • 浏览: 48004 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JavaScript 拖放效果系列二——多元素、分离JS

    博客分类:
  • js
阅读更多
原文来自: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——修复错误
分享到:
评论

相关推荐

    jQuery实现的9宫格拼图游戏效果.zip

    这个项目提供了一个实际应用jQuery技能的机会,同时涉及到前端开发中的布局设计、事件处理、动画效果和用户交互等多个方面,对于提升JavaScript和前端开发技能有着显著的帮助。通过学习和实践,开发者不仅可以掌握...

    ASP.NET源码——[聊天留言]穷小子asp.net留言板.zip

    7. **用户界面设计**:ASP.NET中的Web Forms允许开发者使用拖放控件的方式创建用户界面,而CSS和JavaScript可以用来实现更丰富的交互效果和美化界面。 8. **调试与部署**:ASP.NET提供了强大的调试工具,帮助开发者...

    DHTML 手册

    3. **页面元素动画**:利用CSS3动画和JavaScript库(如jQuery)实现平滑的元素移动、缩放、旋转等效果。 4. **响应式设计**:结合CSS媒体查询,使网页能根据设备屏幕尺寸自适应调整布局。 5. **拖放功能**:实现用户...

    DIV+CSS网页设计效果2

    【DIV+CSS网页设计效果2】这一主题涵盖了网页设计中的核心元素——布局和样式,以及与之相关的JSP动态网页技术。在这个专题中,我们将深入探讨如何利用DIV和CSS实现高效的网页布局,以及如何结合JSP来提升网页的交互...

    ASP.NET源码——[论坛社区]Zealot Forums v1.0.0.zip

    框架还提供了控件模型,允许通过拖放方式在页面上创建和配置用户界面元素,极大地简化了开发流程。 Zealot Forums v1.0.0可能包含以下关键组件: 1. 数据库设计:论坛通常需要存储用户信息、主题、帖子、分类等...

    DHTML 中文 手册 前台人员必备 chm 格式

    **DHTML中文手册——前台开发者的知识宝典** DHTML(Dynamic HTML)是一种在网页上创建动态、交互性内容的技术,它结合了HTML、CSS、JavaScript以及DOM(Document Object Model)来实现页面的动态更新,而无需重新...

    ASP.NET源码——[博客空间]IdioBlog(NClay)源码.zip

    【ASP.NET 源码分析——IdioBlog (NClay) 源码详解】 ASP.NET 是微软推出的一种用于构建动态网站、Web 应用程序和服务的开发框架。它基于.NET Framework,提供了丰富的功能和易用性,使得开发者能够快速高效地构建...

    mission:用 node.js 和 angular.js 编写的待办事项应用程序

    总的来说,“mission:用 node.js 和 angular.js 编写的待办事项应用程序”是一个典型的前后端分离的Web开发实例,展示了JavaScript全栈开发的强大能力,对于学习和实践Web开发的开发者来说,这是一个很好的实战项目...

    My-Portfolio-Design:我仅使用HTML5,CSS,引导程序4和JavaScript(带有框架)设计了此产品组合

    在这个作品集中,JavaScript可能被用来实现动态效果,如页面滚动时的导航高亮、模态对话框、轮播图或者表单验证等功能。同时,它也可以与HTML5的API结合,如WebSocket实现实时通信,或者Web Storage处理客户端数据...

    Qt及Qt+Quick开发实战精解

    QML允许开发者通过简单的JSON-like语法定义界面元素,如按钮、文本框等,并可以通过JavaScript实现逻辑控制。这种分离视图和逻辑的方式极大地提高了开发效率,尤其是对于UI设计者和开发者之间的协作。 在Qt Quick中...

    jquery插件使用方法大全

    jQuery UI中包含大量预定义好的部件(widget),以及一组用于构建高级元素(例如可拖放的界面元素)的工具。 jQuery 1.2.6(2008年5月):这一版主要是将Brandon Aaron开发的流行的Dimensions插件的功能移植到了核心...

    Silverlight及Blend学习电子书(一)

    5. **XAML语言**:XML标记语言XAML用于定义Silverlight应用的UI布局和样式,使得设计和代码分离,便于维护和扩展。 【描述】中的"Silverlight及Blend的电子教学文档",暗示了另一个工具—— Blend。 Blend是微软的...

    基于HTML5_BootStrap_SSM图书查询借阅网站设计可升级SpringBoot毕业源码案例设计.zip

    HTML5引入了许多新特性,如语义化标签(如、、等)、离线存储、拖放功能、媒体元素(音频和视频)的内置支持以及改进的数据输入控件。在这个图书查询借阅网站中,HTML5被用来构建用户友好的界面,提供更丰富的交互性...

    Ext-Desktop

    通过使用Ext-Desktop,开发者可以快速构建出具有多窗口、拖放功能、系统托盘等桌面应用特点的Web应用。 标签"Ext,java"表明了这个项目与两种技术紧密相关。ExtJS是JavaScript库,但它的许多功能依赖于后端服务器的...

    java源码包2

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    Qt assistant—版权所有

    **Qt Assistant——版权所有** Qt Assistant 是一个强大的文档查看器,是Qt开发环境中不可或缺的一部分,尤其对于初学者来说,它是理解和掌握Qt库的关键工具。它提供了详细的API文档,帮助开发者快速查找并理解Qt类...

    web

    随着Web技术的发展,HTML5引入了许多新特性,如本地存储、拖放功能、离线应用、新的媒体元素(如`&lt;audio&gt;`和`&lt;video&gt;`)以及更多的表单控件等,大大增强了Web应用程序的能力。同时,HTML5也提高了对移动设备的支持,...

    顽强的

    2. HTML元素:HTML由一系列元素构成,每个元素都有其特定的标签,如`&lt;p&gt;`用于段落,`&lt;img&gt;`用于图片,`&lt;a&gt;`用于链接。元素可以是闭合的(自闭合,如` `),也可以是开放的,包含内容,如`内容&lt;/div&gt;`。 3. HTML...

    gengine_en:gengine英文doc

    然而,更常见的是使用CSS(Cascading Style Sheets)来分离样式和内容,实现更好的代码组织和重用。 5. **JavaScript与HTML交互** HTML页面的动态效果和交互性通常依赖于JavaScript。通过`&lt;script&gt;`标签,可以引入...

    基于.NET的网上新闻系统

    这个描述揭示了项目的基本背景——一个教育环境中的实践项目,可能是计算机科学或相关专业学生的期末作业。学生投入了3周的时间来完成,这表明项目的规模和复杂性适中,足以涵盖基本的Web开发概念和技术。同时,学生...

Global site tag (gtag.js) - Google Analytics