拖动一个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 相关文章推荐
js模拟类继承小例子
Jul 17 Javascript
extjs 如何给column 加上提示
Jul 29 Javascript
jQuery 1.9移除了$.browser可以使用$.support来替代
Sep 03 Javascript
如何减少浏览器的reflow和repaint
Feb 26 Javascript
Javascript监视变量变化的方法
Jun 09 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
Mar 08 Javascript
jQuery使用cookie与json简单实现购物车功能
Apr 15 Javascript
Bootstrap table使用方法记录
Aug 23 Javascript
jQuery中过滤器的基本用法示例
Oct 11 jQuery
Angular 组件之间的交互的示例代码
Mar 24 Javascript
vue自定义指令directive的使用方法
Apr 07 Javascript
vue 组件内获取actions的response方式
Nov 08 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
最令PHP初学者们头痛的十四个问题
2007/01/15 PHP
php合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
PHP 魔术函数使用说明
2010/05/14 PHP
php代码中使用换行及(\n或\r\n和br)的应用
2013/02/02 PHP
PHP中time(),date(),mktime()区别介绍
2013/09/28 PHP
php用header函数实现301跳转代码实例
2013/11/25 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
详解Laravel5.6 Passport实现Api接口认证
2018/07/27 PHP
JavaScript高级程序设计 XML、Ajax 学习笔记
2011/09/10 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
用jquery模仿的a的title属性的例子
2014/10/22 Javascript
JavaScript弹出新窗口后向父窗口输出内容的方法
2015/04/06 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
浅析Javascript中bind()方法的使用与实现
2016/05/30 Javascript
JavaScript中的工厂函数(推荐)
2017/03/08 Javascript
js浏览器滚动条卷去的高度scrolltop(实例讲解)
2017/07/07 Javascript
vue实现商城上货组件简易版
2017/11/27 Javascript
解决vue项目 build之后资源文件找不到的问题
2020/09/12 Javascript
javascript自定义加载loading效果
2020/09/15 Javascript
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
python3实现抓取网页资源的 N 种方法
2017/05/02 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
2018/10/11 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
2019/06/10 Python
python向字符串中添加元素的实例方法
2019/06/28 Python
python模拟鼠标点击和键盘输入的操作
2019/08/04 Python
用sqlalchemy构建Django连接池的实例
2019/08/29 Python
OpenCV+python实现膨胀和腐蚀的示例
2020/12/21 Python
外贸采购员求职的自我评价
2013/11/26 职场文书
红旗团支部事迹材料
2014/01/27 职场文书
会计自荐信范文
2014/03/09 职场文书
消防标语大全
2014/06/07 职场文书
2014入党积极分子破除“四风”思想汇报
2014/09/14 职场文书
大学生奖学金获奖感言(范文)
2019/08/15 职场文书
python 下划线的多种应用场景总结
2021/05/12 Python
python opencv通过按键采集图片源码
2021/05/20 Python
Python爬虫实战之爬取京东商品数据并实实现数据可视化
2021/06/07 Python