拖动一个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 相关文章推荐
window.name代替cookie的实现代码
Nov 28 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
May 01 Javascript
js浏览器本地存储store.js介绍及应用
May 13 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
May 26 Javascript
AngularJS入门教程之Select(选择框)详解
Jul 27 Javascript
jQuery Validate插件自定义验证规则的方法
Dec 27 Javascript
Vue中之nextTick函数源码分析详解
Oct 17 Javascript
Angular angular-file-upload文件上传的示例代码
Aug 23 Javascript
js canvas实现写字动画效果
Nov 30 Javascript
js实现全选和全不选功能
Jul 28 Javascript
JavaScript的function函数详细介绍
Nov 20 Javascript
Promise静态四兄弟实现示例详解
Jul 07 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
Apache2 httpd.conf 中文版
2006/12/06 PHP
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
PHP中常用的数组操作方法笔记整理
2016/05/16 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
2021/03/09 PHP
firefox和IE系列的相关区别整理 以备后用
2009/12/28 Javascript
让ie运行js时提示允许阻止内容运行的解决方法
2010/10/24 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
2012/06/27 Javascript
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
2013/06/29 Javascript
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
JavaScript屏蔽Backspace键的实现代码
2017/11/02 Javascript
使用Angular CLI进行Build(构建)和Serve详解
2018/03/24 Javascript
深入理解js 中async 函数的含义和用法
2018/05/13 Javascript
LayUI表格批量删除方法
2018/08/15 Javascript
vueJs实现DOM加载完之后自动下拉到底部的实例代码
2018/08/31 Javascript
分享一个vue项目“脚手架”项目的实现步骤
2019/05/26 Javascript
小程序实现长按保存图片的方法
2019/12/31 Javascript
原生JS实现烟花效果
2020/03/10 Javascript
[03:00]2018完美盛典_最佳英雄奖
2018/12/17 DOTA
python 将md5转为16字节的方法
2018/05/29 Python
浅谈Python中的全局锁(GIL)问题
2019/01/11 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
Django缓存系统实现过程解析
2019/08/02 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
Python 操作 MySQL数据库
2020/09/18 Python
英国领先的在线高尔夫商店:Scottsdale Golf
2019/08/26 全球购物
马来西亚在线健康商店:Medipal Malaysia
2020/04/13 全球购物
英语专业应届生求职信范文
2013/11/15 职场文书
旅游专业职业生涯规划范文
2014/01/13 职场文书
2014老师三严三实对照检查材料思想汇报
2014/09/18 职场文书
房屋产权共有协议书范本
2014/11/03 职场文书
2014年食堂工作总结
2014/11/20 职场文书
党员检讨书范文
2014/12/27 职场文书
服务员岗位职责范本
2015/04/09 职场文书
毕业欢送会致辞
2015/07/29 职场文书