拖动一个HTML元素


Posted in Javascript onDecember 22, 2006

<script content="text/javascript">
var iMouseDown = false;
var dragObject = null;
Number.prototype.NaN0=function(){return isNaN(this)?0:this;}

// Demo 0 variables
var DragDrops = [];
var curTarget = null;
var lastTarget = null;

function makeDraggable(item){
  if(!item) return;
  item.onmousedown = function(ev){
    dragObject = this;
    mouseOffset = getMouseOffset(this, ev);
    return false;
  }
}

function getMouseOffset(target, ev){
  ev = ev || window.event;

  var docPos = getPosition(target);
  var mousePos = mouseCoords(ev);
  return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}

function getPosition(e){
  var left = 0;
  var top = 0;
  while (e.offsetParent){
    left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
    top += e.offsetTop + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);
    e = e.offsetParent;
  }

  left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
  top += e.offsetTop + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);

  return {x:left, y:top};

}

function mouseCoords(ev){
  if(ev.pageX || ev.pageY){
    return {x:ev.pageX, y:ev.pageY};
  }
  return {
    x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
    y:ev.clientY + document.body.scrollTop - document.body.clientTop
  };
}

function mouseDown(ev){
  ev = ev || window.event;
  var target = ev.target || ev.srcElement;

  if(target.onmousedown || target.getAttribute('DragObj')){
    return false;
  }
}

function mouseUp(ev){

  //dragObject = null;

  if(dragObject){
    ev = ev || window.event;
    var mousePos = mouseCoords(ev);

    var dT = dragObject.getAttribute('droptarget');
    if(dT){
      var targObj = document.getElementById(dT);
      var objPos = getPosition(targObj);
      if((mousePos.x > objPos.x) && (mousePos.y > objPos.y) 
&& (mousePos.x<(objPos.x+parseInt(targObj.offsetWidth)))
 && (mousePos.y<(objPos.y+parseInt(targObj.offsetHeight)))){
        var nSrc = targObj.getAttribute('newSrc');
        if(nSrc){
          dragObject.src = nSrc;
          setTimeout(function(){
            if(!dragObject || !dragObject.parentNode) return;
            dragObject.parentNode.removeChild(dragObject);
            dragObject = null;
          }, parseInt(targObj.getAttribute('timeout')));
        } else {
          dragObject.parentNode.removeChild(dragObject);
        }
      }
    }
  }
  dragObject = null;

  iMouseDown = false;
}

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);

  if(dragObject){
    dragObject.style.position = 'absolute';
    dragObject.style.top = mousePos.y - mouseOffset.y;
    dragObject.style.left = mousePos.x - mouseOffset.x;
  }

  // track the current mouse state so we can compare against it next time
  lMouseState = iMouseDown;

  // this prevents items on the page from being highlighted while dragging
  if(curTarget || dragObject) return false;
}

function addDropTarget(item, target){
  item.setAttribute('droptarget', target);
}

document.onmousemove = mouseMove;
document.onmousedown = mouseDown;
document.onmouseup = mouseUp;

window.onload = function (){
  makeDraggable(document.getElementById('DragImage9'));
  makeDraggable(document.getElementById('DragImage10'));
  makeDraggable(document.getElementById('DragImage11'));
  makeDraggable(document.getElementById('DragImage12'));

  addDropTarget(document.getElementById('DragImage9'), 'TrashImage1');
  addDropTarget(document.getElementById('DragImage10'), 'TrashImage1');
  addDropTarget(document.getElementById('DragImage11'), 'TrashImage1');
  addDropTarget(document.getElementById('DragImage12'), 'TrashImage1');
}
</script>
</head>
<body>

<fieldset id="Demo6" style="height: 70px"><h3>Demo - Drag any of the images</h3>
<img id="TrashImage1" src="http://www.cnlei.org/codes/javascript/js-drag-drop/images/drag_drop_trash.gif" />
<img id="DragImage9" src="http://www.cnlei.org/codes/javascript/js-drag-drop/images/drag_drop_spade.gif" />
<img id="DragImage10" src="http://www.cnlei.org/codes/javascript/js-drag-drop/images/drag_drop_heart.gif" />
<img id="DragImage11" src="http://www.cnlei.org/codes/javascript/js-drag-drop/images/drag_drop_diamond.gif" />
<img id="DragImage12" src="http://www.cnlei.org/codes/javascript/js-drag-drop/images/drag_drop_club.gif" />
</fieldset>

Javascript 相关文章推荐
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.2 0
Mar 22 Javascript
一段利用WSH获取登录时间的jscript代码
May 11 Javascript
获取焦点时,利用js定时器设定时间执行动作
Apr 02 Javascript
javascript计时器事件使用详解
Jan 07 Javascript
jquery滚动特效集锦
Jun 03 Javascript
完美JQuery图片切换效果的简单实现
Jul 21 Javascript
AngularJS入门教程之控制器详解
Jul 27 Javascript
相册展示PhotoSwipe.js插件实现
Aug 25 Javascript
详解jQuery中的isPlainObject()使用方法
Feb 27 jQuery
如何理解Vue的v-model指令的使用方法
Jul 19 Javascript
Vue 莹石摄像头直播视频实例代码
Aug 31 Javascript
浅谈关于iview表单验证的问题
Sep 29 Javascript
JavaScript中Array 对象相关的几个方法
Dec 22 #Javascript
JavaScript事件列表解说
Dec 22 #Javascript
改进:论坛UBB代码自动插入方式
Dec 22 #Javascript
用javascript获取地址栏参数
Dec 22 #Javascript
在IE下:float属性会影响offsetTop的取值
Dec 22 #Javascript
Javascript实现的分页函数
Dec 22 #Javascript
一些常用的Javascript函数
Dec 22 #Javascript
You might like
PHP3 safe_mode 失效漏洞
2006/10/09 PHP
php 文件上传代码(限制jpg文件)
2010/01/05 PHP
php分页代码学习示例分享
2014/02/20 PHP
PHP函数addslashes和mysql_real_escape_string的区别
2014/04/22 PHP
PHP批量生成图片缩略图的方法
2015/06/18 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
Avengerls vs KG BO3 第三场2.18
2021/03/10 DOTA
node+express+jade制作简单网站指南
2014/11/26 Javascript
JQuery 设置checkbox值二次无效的解决方法
2016/07/22 Javascript
js获取当前时间(昨天、今天、明天)
2016/11/23 Javascript
Vue.js实战之组件之间的数据传递
2017/04/01 Javascript
如何开发出更好的JavaScript模块
2017/12/22 Javascript
JavaScript实现的超简单计算器功能示例
2017/12/23 Javascript
vue自定义一个v-model的实现代码
2018/06/21 Javascript
微信小程序云开发如何使用npm安装依赖
2019/05/18 Javascript
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
Vue实现简单购物车功能
2020/12/13 Vue.js
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
Python的__builtin__模块中的一些要点知识
2015/05/02 Python
Python的Django框架中URLconf相关的一些技巧整理
2015/07/18 Python
教大家使用Python SqlAlchemy
2016/02/12 Python
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
2017/12/19 Python
ubuntu17.4下为python和python3装上pip的方法
2018/06/12 Python
Python实现的微信好友数据分析功能示例
2018/06/21 Python
Python多进程原理与用法分析
2018/08/21 Python
python 将json数据提取转化为txt的方法
2018/10/26 Python
Python画图高斯分布的示例
2019/07/10 Python
给ubuntu18安装python3.7的详细教程
2020/06/08 Python
python如何将图片转换素描画
2020/09/08 Python
video.js支持m3u8格式直播的实现示例
2020/05/20 HTML / CSS
爱奇艺VIP会员:大剧抢先看
2018/07/11 全球购物
会计与审计专业大专生求职信
2013/10/03 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
师德师风建设整改措施思想汇报
2014/10/11 职场文书
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL
Windows安装Anaconda3的方法及使用过程详解
2021/06/11 Python