拖动一个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 css在IE和Firefox中区别分析
Feb 18 Javascript
可插入图片的TEXT文本框
Dec 27 Javascript
js获取光标位置和设置文本框光标位置示例代码
Jan 09 Javascript
jQuery 无限级菜单的简单实例
Feb 21 Javascript
JS实现很酷的水波文字特效实例
Feb 26 Javascript
JS DOM实现鼠标滑动图片效果
Sep 17 Javascript
AngularJS ng-controller 指令简单实例
Aug 01 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
Dec 26 Javascript
nginx部署访问vue-cli搭建的项目的方法
Feb 12 Javascript
关于jquery layui弹出层的使用方法
Apr 21 jQuery
微信公众号H5支付接口调用方法
Jan 10 Javascript
jQuery中DOM常见操作实例小结
Aug 01 jQuery
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
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
Zend Framework教程之Zend_Layout布局助手详解
2016/03/04 PHP
php版微信小店API二次开发及使用示例
2016/11/12 PHP
php实现遍历文件夹的方法汇总
2017/03/02 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
2018/04/21 PHP
js 动态添加标签(新增一行,其实很简单,就是几个函数的应用)
2009/03/26 Javascript
Jquery数独游戏解析(一)-页面布局
2010/11/05 Javascript
动态创建样式表在各浏览器中的差异测试代码
2011/09/13 Javascript
javascript基于DOM实现省市级联下拉框的方法
2015/05/14 Javascript
three.js快速入门【推荐】
2017/01/21 Javascript
JS判断微信扫码的方法
2017/08/07 Javascript
小程序自定义弹框效果
2020/11/16 Javascript
使用python调用zxing库生成二维码图片详解
2017/01/10 Python
浅谈Python对内存的使用(深浅拷贝)
2018/01/17 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
2018/07/07 Python
python编写计算器功能
2019/10/25 Python
python取均匀不重复的随机数方式
2019/11/27 Python
Python数据可视化:幂律分布实例详解
2019/12/07 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
浅谈django框架集成swagger以及自定义参数问题
2020/07/07 Python
Python3爬虫关于代理池的维护详解
2020/07/30 Python
HTML5新特性之用SVG绘制微信logo
2016/02/03 HTML / CSS
荷兰本土平价百货:HEMA
2017/10/23 全球购物
美国性感内衣店:Yandy
2018/06/12 全球购物
狗狗玩具、零食和咀嚼物的月度送货服务:Super Chewer
2018/08/22 全球购物
预备党员思想汇报
2014/01/08 职场文书
社区七一党员活动方案
2014/01/25 职场文书
师德学习感言
2014/01/31 职场文书
军人违纪检讨书
2014/02/04 职场文书
2014学年自我鉴定
2014/02/23 职场文书
留学生求职信
2014/06/03 职场文书
未受刑事制裁公证证明
2014/09/20 职场文书
个人剖析材料及整改措施
2014/10/07 职场文书
2019脱贫攻坚工作总结报告范本!
2019/08/06 职场文书
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫