拖动一个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 相关文章推荐
Mootools 1.2教程 滑动效果(Slide)
Sep 15 Javascript
jQuery入门知识简介
Mar 04 Javascript
javascript 从if else 到 switch case 再到抽象
Jul 17 Javascript
jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同的解决办法
May 13 Javascript
Jquery使用val方法读写value值
May 18 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
May 16 Javascript
移动适配的几种方案(三种方案)
Nov 25 Javascript
微信小程序websocket实现聊天功能
Mar 30 Javascript
解决微信小程序防止无法回到主页的问题
Sep 28 Javascript
angular 用Observable实现异步调用的方法
Dec 27 Javascript
微信小程序实现点击空白隐藏的方法示例
Aug 13 Javascript
Nuxt页面级缓存的实现
Mar 09 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
如何给phpadmin一个保护
2006/10/09 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
php将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
PHP使用Pear发送邮件(Windows环境)
2016/01/05 PHP
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
2012/10/11 Javascript
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
jquery无缝向上滚动实现代码
2013/03/29 Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
2015/02/18 Javascript
深入理解Java线程编程中的阻塞队列容器
2015/12/07 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
JS函数多个参数默认值指定方法分析
2016/11/28 Javascript
Vue监听数组变化源码解析
2017/03/09 Javascript
AngularJS实现根据不同条件显示不同控件
2017/04/20 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
2017/08/16 Javascript
Vue基于NUXT的SSR详解
2017/10/24 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
Vue 实现前端权限控制的示例代码
2019/07/09 Javascript
JS的时间格式化和时间戳转换函数示例详解
2020/07/27 Javascript
举例讲解Python程序与系统shell交互的方式
2015/04/09 Python
使用Python的PEAK来适配协议的教程
2015/04/14 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
tensorflow 初始化未初始化的变量实例
2020/02/06 Python
python通过matplotlib生成复合饼图
2020/02/06 Python
垃圾回收的优点和原理
2014/05/16 面试题
热能动力工程毕业生自荐信
2013/11/07 职场文书
平面设计师的工作职责
2013/11/21 职场文书
出纳岗位职责范本
2013/12/01 职场文书
银行职业规划书范文
2013/12/28 职场文书
理工大学毕业生自荐信范文
2014/02/22 职场文书
精神文明建设标语
2014/06/16 职场文书
2014党员整改措施思想汇报
2014/10/07 职场文书
职工年度考核评语
2014/12/31 职场文书
2015年小学英语教师工作总结
2015/05/12 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
python unittest单元测试的步骤分析
2021/08/02 Python
Sentry的安装、配置、使用教程(Sentry日志手机系统)
2022/07/23 Python