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

JavaScript 拖放效果系列三——解决快速拖拽的问题

    博客分类:
  • js
阅读更多
原文来自:http://www.cainiao8.com/web/js_examples/15_tuozhuai3.html



上一节我们让拖拽代码使用起来更方便、适用于多个元素,同时解决了偶尔会出现的拖动一个元素,多个元素一起移动的问题。但是在快速拖拽的时候,会出现延迟,或者元素干脆就停止移动了。
元素停止移动的原因

分析一下上面问题的原因:鼠标滑动地太快,自然会造成mousemove事件多次发生,相应的,事件处理函数也多次被调用,自然造成延迟。延迟之后,元素移动的速度赶不上鼠标移动的速度,可能造成鼠标移出元素的状态,从而触发了mouseout事件,从而造成了被拖动元素停止移动。

为了验证上面的想法,我们给元素添加一个onmouseout的响应函数,来显示一段字符串。修改代码如下:
<script type="text/javascript">
function dragInit(node){
	if(node.className == "drag"){ 
		……
		node.onmouseout = out;
		……
	}
		……
}
……
function out(){
	alert("鼠标一出去啦,我不能再移动啦!!");
}
……
</script>


点击进入测试页面,可以发现浏览器对mouseout十分敏感,我在IE和FF下做了测试,只要稍微移动的快一点,就会触发鼠标移出事件。但是只要在视觉上鼠标还没有移出元素,那么元素还是可以正常移动的。但是如果鼠标“看起来”移出了元素,那么拖拽效果就真的彻底被破坏了。
解决快速拖拽时元素停止移动的问题

这个问题是不可避免的吗?当然不是,如果你是豆瓣的用户,可以进入“我的豆瓣”栏目测试一下它们的拖拽功能()。就算拖拽的速度再快也不会出现“突然停止”的情况。


我们也来试着解决这个问题。上面已经分析了,造成元素停止移动的原因是鼠标移出了被拖拽的元素,造成mousemove事件无法得到响应。那么我们让 mousemove事件在有延迟的情况下仍然可以被响应就可以了,我们只要把事件处理函数加到document上就可以做到这一点了(之前也想过其它解决方案,但是失败了)。修改之后的代码如下:

<script type="text/javascript">
//使用该变量标识拖拽的元素
var dragElement = null;
……
function dragInit(node){
	if(node.className == "drag"){ 
		node.onmousedown = down;
		//使用document响应mousemove事件
		document.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]);
	}
}
function down(event)
{	
……
}
function move(event){
	event = event || window.event;
	//判断dragElement是否为null,即是否为拖拽状态
	if(dragElement){
		var x,y;
		y = event.clientY - mouseY + objY;
		x = event.clientX - mouseX + objX;
		//改变dragElement的位置
		dragElement.style.top = y + "px";
		dragElement.style.left = x + "px";
	}
}
function docUp(){
	//停止拖拽
	dragElement = null;
}
……
</script>


可以在修改之后的测试页面实验一下,无论速度多快,延迟都不会造成被拖拽元素停止移动的问题。下面就解释一下主要的修改之处:

   1. 使用全局变量dragElement来标记当前拖拽元素。
   2. dragInit函数中,给document定义mouseover的响应函数。
   3. mousemove的响应函数的针对对象不再是this,而是dragElement。

JavaScript拖拽系列

   1. JavaScript拖拽
   2. JavaScript拖拽2——多元素、分离JS
   3. JavaScript拖拽3——解决快速拖拽的问题
   4. JavaScript拖拽4——获得元素的位置
   5. JavaScript拖拽5——性能优化
   6. JavaScript拖拽6——修复错误
分享到:
评论

相关推荐

    一个JavaScript库让文件能够拖放到任何HTML元素上

    综上所述,这个JavaScript库——lifenautjoe-droppable-6023517,旨在帮助开发者轻松实现HTML5文件拖放功能,提供一个用户友好的交互界面,同时也可能包含了解决兼容性和扩展功能的代码。如果你需要进一步了解这个库...

    ASP.NET源码——网页层拖动实例(ASP.NET+AJAX).zip

    在这个特定的源码实例中,结合了ASP.NET与AJAX(异步JavaScript和XML)技术,实现了网页层的拖动功能,这在现代Web开发中是常见的交互设计,如拖放式布局或可移动的对话框。 1. **ASP.NET基础** ASP.NET提供了丰富...

    jQuery拖动拖拽插件draggabilly.pkgd.js

    本文将深入探讨基于jQuery的拖动拖拽插件——draggabilly.pkgd.js。 一、draggabilly.pkgd.js概述 draggabilly.pkgd.js是一款强大的jQuery插件,它使得任何HTML元素都能够具备拖放功能。该插件由David DeSandro...

    PHP实例开发源码——鼠标拖拽可视化编辑企业网站系统CmsEasyphp版.zip

    【PHP实例开发源码——鼠标拖拽可视化编辑企业网站系统CmsEasyphp版】 这个压缩包文件提供了一个基于PHP的实战项目源码,名为"CmsEasyphp版",它是一个企业级网站管理系统,具备可视化编辑功能,允许用户通过鼠标...

    Ext中拖拽Tree2Grid , 清空表格拖拽失效的解决办法>.<

    本文将深入探讨一个具体的使用场景——如何实现从Tree组件到Grid组件的拖拽功能,并解决在清空Grid后拖拽功能失效的问题。这个问题在实际开发中可能会遇到,尤其是在需要动态管理数据的界面中。 首先,EXTJS的Tree...

    ASP.NET源码——可拖动、改变列宽的GridView源码.zip

    - JavaScript文件则负责前端交互逻辑,如拖放效果和宽度调整的动画。 4. **学习价值**: - 对于初学者,这个源码提供了一个深入理解ASP.NET GridView控件的实例,学习如何扩展和定制其功能。 - 对于开发者,可以...

    JS实现列表图片拖拽排序效果特效源码.zip

    本资源"JS实现列表图片拖拽排序效果特效源码.zip"提供了一种JavaScript实现这一功能的解决方案。下面将详细介绍这个功能的实现原理和相关知识点。 1. **HTML结构**: 在HTML中,你需要创建一个包含图片的列表结构...

    由约翰尼五世和布洛克利主演的拖放式机器人教育图书馆(人群疯狂)_whole-npm_JavaScript_下载.zip

    《拖放式机器人教育图书馆——JavaScript编程的奇妙世界》 在信息技术日新月异的今天,编程已经成为一种必备技能,而JavaScript作为Web开发的核心语言,更是受到广泛关注。这个名为"由约翰尼五世和布洛克利主演的...

    DragTest.zip

    在IT行业中,前后端交互是构建现代Web应用的基础,而"DragTest.zip"这个压缩包文件显然关注的是一个具体的交互技术——JavaScript实现的拖放功能(js拖拽)。这一技术通常用于提高用户界面的交互性和易用性,比如在...

    JQuery实现图片拖拽替换效果

    在本文中,我们将深入探讨如何使用JQuery库来实现一个有趣的交互功能——图片拖拽替换效果。这个功能允许用户通过拖放操作来替换页面上的图片,增强了用户体验并提供了直观的界面交互。 首先,我们需要理解JQuery的...

    百度弹出登录框鼠标拖拽效果代码.zip

    在本例中,我们将关注的是一个特定类型的拖放——拖拽窗口或元素,即登录框。 1. **HTML结构**: - 创建一个登录框的HTML元素,通常是一个`div`,并设置相应的CSS样式使其看起来像一个弹出窗口。这个元素需要一个...

    基于HTML5 SVG拖拽的JavaScript库插件源码.zip

    通过JavaScript库,开发者可以快速实现这些功能,同时保持代码的整洁和可维护性。 总结来说,这个压缩包提供的资源可以帮助开发者利用HTML5 SVG的拖放功能来增强他们的Web应用。通过理解和使用提供的JavaScript库,...

    Javascript特效代码大全

    6. **拖放功能**:JavaScript支持拖放API,使得用户可以方便地拖动网页元素,常用于文件上传、布局调整等场景。 7. **图形绘制**:利用Canvas或SVG,JavaScript可以实现强大的图形绘制功能,制作图表、游戏、甚至...

    点击按钮弹出DIV,可以拖动,操作方便!

    4. **可拖动(Draggable)**:为了让 `div` 可以被拖动,我们需要利用JavaScript(或jQuery UI库)的拖放功能。这通常涉及到设置事件监听器,如 `mousedown`、`mousemove` 和 `mouseup`,来捕捉用户的拖动操作并更新...

    简单好用的jQuery插件——Tdrag.js可以任意拖拽div内容.zip

    在网页开发中,我们常常需要实现用户可以通过鼠标拖动元素来调整其位置的功能,比如在布局编辑器、日历应用或拖放式文件管理器中。jQuery Tdrag.js 插件就是这样一个工具,它使得在网页上任意拖拽`div`内容变得...

    拖拽 Draganddrop.html

    这个链接指向的博客文章可能详细介绍了如何创建和实现拖放功能,包括HTML、CSS和JavaScript的相关代码,以及可能遇到的问题和解决策略。 【标签】:“源码 工具” “源码”标签表明这个示例包含了实际的代码,读者...

    带弹性摇摆效果的卡片js拖拽插件swing

    今天我们将讨论一个基于jQuery的插件——"swing",它为卡片元素提供了独特的拖拽功能,特别是在卡片移出容器时添加了引人注目的弹性摇摆效果。 "swing"插件的核心功能在于实现卡片元素的拖拽行为。用户可以通过鼠标...

    谈谈对JavaScript原生拖放的深入理解

     拖放(drag-and-drop,DnD)其实是两个动作——拖和放。所以,它涉及到两个元素。一个是被拖的元素,称为拖放源;另一个是要放的目标,称为拖放目标。本文将通过拆分这两个概念来详细介绍原生拖放 拖放源  什么样...

    accessible-drag-and-drop:扩展 HTML5 拖放功能——因此它可以处理多个元素,并支持键盘交互

    "accessible-drag-and-drop"项目正是为了解决这个问题,它扩展了HTML5的拖放功能,使其能够更好地服务于视力正常和使用屏幕阅读器的用户。 在这个项目中,主要涉及以下几个关键知识点: 1. **...

    JS特效(可拖动的div框)和用AJAX实现的可拖动的div框

    本主题聚焦于一个常见的JS特效——可拖动的div框,并探讨如何结合AJAX技术来实现更丰富的功能。 首先,让我们理解什么是可拖动的div框。在HTML中,div是一个用于组合其他HTML元素的容器。通过应用JavaScript,我们...

Global site tag (gtag.js) - Google Analytics