拖动一个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查找法实现当前栏目的高亮显示的代码
Nov 24 Javascript
基于jquery的设置页面文本框 只能输入数字的实现代码
Apr 19 Javascript
yepnope.js 异步加载资源文件
Sep 08 Javascript
jQuery 在光标定位的地方插入文字的插件
May 10 Javascript
在JavaScript中操作时间之getMonth()方法的使用
Jun 10 Javascript
新手简单了解vue
May 29 Javascript
Vue引入Stylus知识点总结
Jan 16 Javascript
webpack的 rquire.context用法实现工程自动化的方法
Feb 07 Javascript
详解三种方式在React中解决绑定this的作用域问题并传参
Aug 18 Javascript
JavaScript中的执行环境和作用域链
Sep 04 Javascript
Javascript生成器(Generator)的介绍与使用
Jan 31 Javascript
JS 4个超级实用的小技巧 提升开发效率
Oct 05 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
CI(CodeIgniter)框架配置
2014/06/10 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
PHP实现倒计时功能
2020/11/16 PHP
javascript不同页面传值的改进版
2008/09/30 Javascript
用js做一个小游戏平台 (一)
2009/12/29 Javascript
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
在JavaScript中构建ArrayList示例代码
2014/09/17 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
2015/03/04 Javascript
js运动动画的八个知识点
2015/03/12 Javascript
JavaScript如何禁止Backspace键
2015/12/02 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
2017/04/07 Javascript
JS实现页面打印(整体、局部)
2017/08/18 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
2020/06/17 Javascript
对mac下nodejs 更新到最新版本的最新方法(推荐)
2018/05/17 NodeJs
解决Js先触发失去焦点事件再执行点击事件的问题
2018/08/30 Javascript
node将geojson转shp返回给前端的实现方法
2019/05/29 Javascript
VUE中使用HTTP库Axios方法详解
2020/02/05 Javascript
python原始套接字编程示例分享
2014/02/21 Python
python下实现二叉堆以及堆排序的示例
2017/09/29 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
ORM Django 终端打印 SQL 语句实现解析
2019/08/09 Python
简单了解python列表和元组的区别
2020/05/14 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
Python 操作SQLite数据库的示例
2020/10/16 Python
python动态规划算法实例详解
2020/11/22 Python
C#中有没有静态构造函数,如果有是做什么用的?
2016/06/04 面试题
五年级英语教学反思
2014/01/31 职场文书
财务科科长岗位职责
2014/03/10 职场文书
一体化教学实施方案
2014/05/10 职场文书
北京奥运会主题口号
2014/06/13 职场文书
保外就医申请书范文
2015/08/06 职场文书
感恩教师主题班会
2015/08/12 职场文书
音乐研修感悟
2015/11/18 职场文书
使用scrapy实现增量式爬取方式
2022/06/21 Python