普通版
跨浏览器兼容拖动事件,兼容ie7.可以拖动文本在2个div框中来回拖动
html代码
你可以在2个div框中来回拖动 <div id="wrap"> <div id="sou" style="width: 100px;height: 100px;margin-right: 40px;border: 1px solid black;float: left;"> <p id="txt" draggable="true" style="text-align: center;margin-top: 30px;">这是测试文本</p> </div> <div id="tar" style="width: 100px;height: 100px;border: 1px solid black;float: left;"> </div> </div>
js代码
<script src="http://t99panzer.oss-cn-shanghai.aliyuncs.com/js/Base.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var base = new Base(); var txt = document.getElementById("txt"); var tar = document.getElementById("tar"); var sou = document.getElementById("sou"); var wrap = document.getElementById("wrap"); txt.onmousedown = function(event) { if(this.dragDrop) { this.dragDrop();//兼容ie9以下不能拖动元素的解决办法,给当前元素绑定onmousedown 事件, //并调用dragDrop()方法 } }; // txt.ondragstart = function(event) { event = base.getEvent(event); event.dataTransfer.setData("text", this.id); //直接传this有问题,因为前面是text,只能传文本, //不能传对象,火狐中必须要设置数据,不然要多次点击才能拖动 //第一个值只能为text或者URL }; var fn = function(event) { event = base.getEvent(event); switch(event.type) { case "dragenter": base.preventDefault(event); break; case "dragover": base.preventDefault(event); //取消默认事件,让ondrop能够触发 break; //重写ondragover和ondragenter并取消默认事件,可以让任何元素都可以拖动 case "drop": base.preventDefault(event); //阻止火狐的拖拽打开新的链接 base.stopPropagation(event); //阻止火狐的拖拽打开新的链接 var data = event.dataTransfer.getData("text"); if(target.id != data) { //拖动一下但是仍然在源对象不放入目标对象中时 var a = document.getElementById(data); target.appendChild(a); } break; } } wrap.ondragenter = fn; wrap.ondragover = fn; wrap.ondrop = fn; </script>
完整代码
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <style type="text/css"> * { margin: 0; padding: 0; } div {} </style> </head> <body> 你可以在2个div框中来回拖动 <div id="wrap"> <div id="sou" style="width: 100px;height: 100px;margin-right: 40px;border: 1px solid black;float: left;"> <p id="txt" draggable="true" style="text-align: center;margin-top: 30px;">这是测试文本</p> </div> <div id="tar" style="width: 100px;height: 100px;border: 1px solid black;float: left;"> </div> </div> <script src="http://t99panzer.oss-cn-shanghai.aliyuncs.com/js/Base.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var base = new Base(); var txt = document.getElementById("txt"); var tar = document.getElementById("tar"); var sou = document.getElementById("sou"); var wrap = document.getElementById("wrap"); txt.onmousedown = function(event) { if(this.dragDrop) { this.dragDrop(); } }; // txt.ondragstart = function(event) { event = base.getEvent(event); event.dataTransfer.setData("text", this.id); //直接传this有问题,因为前面是text,只能传文本,不能传对象,火狐中必须要设置数据,不然要多次点击才能拖动 //第一个值只能为text或者URL }; var fn = function(event) { event = base.getEvent(event); var target = base.getTarget(event); switch(event.type) { case "dragenter": base.preventDefault(event); break; case "dragover": base.preventDefault(event); //取消默认事件,让ondrop能够触发 break; case "drop": base.preventDefault(event); //阻止火狐的拖拽打开新的链接 base.stopPropagation(event); //阻止火狐的拖拽打开新的链接 var data = event.dataTransfer.getData("text"); if(target.id != data) { //拖动一下但是仍然在源对象不放入目标对象中时 var a = document.getElementById(data); target.appendChild(a); } break; } } wrap.ondragenter = fn; wrap.ondragover = fn; wrap.ondrop = fn; </script> </body> </html>
带颜色版本
可以在拖动时来回切换颜色
html代码
你可以在2个div框中来回拖动 <div id="wrap"> <div id="sou" style="width: 100px;height: 100px;margin-right: 40px;border: 1px solid black;float: left;"> <p id="txt" draggable="true" style="text-align: center;margin-top: 30px;">这是测试文本</p> </div> <div id="tar" style="width: 100px;height: 100px;border: 1px solid black;float: left;"> </div> </div>
js代码
var base = new Base(); var txt = document.getElementById("txt"); var tar = document.getElementById("tar"); var sou = document.getElementById("sou"); var wrap = document.getElementById("wrap"); txt.onmousedown = function(event) { if(this.dragDrop) { this.dragDrop(); } }; txt.ondragstart = function(event) { var ua = base.browserName(); event = base.getEvent(event); event.dataTransfer.setData("text", this.id); //直接传this有问题,因为前面是text,只能传文本,不能传对象,火狐中必须要设置数据,不然要多次点击才能拖动 //第一个值只能为text或者URL }; sou.ondragenter = function(event) { event = base.getEvent(event); base.preventDefault(event); this.style.backgroundColor = "blue"; }; sou.ondragover = function(event) { event = base.getEvent(event); base.preventDefault(event); }; sou.ondragleave = function(event) { this.style.backgroundColor = ""; }; sou.ondrop = function(event) { event = base.getEvent(event); base.preventDefault(event); //阻止火狐的拖拽打开新的链接 base.stopPropagation(event); //阻止火狐的拖拽打开新的链接 var data = event.dataTransfer.getData("text"); var target = base.getTarget(event); if(target.id != data) { //拖动一下但是仍然在源对象不放入目标对象中时 var a = document.getElementById(data); target.appendChild(a); } }; tar.ondragenter = function(event) { event = base.getEvent(event); base.preventDefault(event); this.style.backgroundColor = "red"; }; tar.ondragover = function(event) { event = base.getEvent(event); base.preventDefault(event); }; tar.ondragleave = function(event) { this.style.backgroundColor = ""; }; tar.ondrop = function(event) { event = base.getEvent(event); base.preventDefault(event); //阻止火狐的拖拽打开新的链接 base.stopPropagation(event); //阻止火狐的拖拽打开新的链接 var data = event.dataTransfer.getData("text"); var target = base.getTarget(event); if(target.id != data) { //拖动一下但是仍然在源对象不放入目标对象中时 var a = document.getElementById(data); target.appendChild(a); } };
完整html代码
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <style type="text/css"> * { margin: 0; padding: 0; } div {} </style> </head> <body> 你可以在2个div框中来回拖动 <div id="wrap"> <div id="sou" style="width: 100px;height: 100px;margin-right: 40px;border: 1px solid black;float: left;"> <p id="txt" draggable="true" style="text-align: center;margin-top: 30px;">这是测试文本</p> </div> <div id="tar" style="width: 100px;height: 100px;border: 1px solid black;float: left;"> </div> </div> <script src="http://t99panzer.oss-cn-shanghai.aliyuncs.com/js/Base.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var base = new Base(); var txt = document.getElementById("txt"); var tar = document.getElementById("tar"); var sou = document.getElementById("sou"); var wrap = document.getElementById("wrap"); txt.onmousedown = function(event) { if(this.dragDrop) { this.dragDrop(); } }; txt.ondragstart = function(event) { var ua = base.browserName(); event = base.getEvent(event); event.dataTransfer.setData("text", this.id); //直接传this有问题,因为前面是text,只能传文本,不能传对象,火狐中必须要设置数据,不然要多次点击才能拖动 //第一个值只能为text或者URL }; sou.ondragenter = function(event) { event = base.getEvent(event); base.preventDefault(event); this.style.backgroundColor = "blue"; }; sou.ondragover = function(event) { event = base.getEvent(event); base.preventDefault(event); }; sou.ondragleave = function(event) { this.style.backgroundColor = ""; }; sou.ondrop = function(event) { event = base.getEvent(event); base.preventDefault(event); //阻止火狐的拖拽打开新的链接 base.stopPropagation(event); //阻止火狐的拖拽打开新的链接 var data = event.dataTransfer.getData("text"); var target = base.getTarget(event); if(target.id != data) { //拖动一下但是仍然在源对象不放入目标对象中时 var a = document.getElementById(data); target.appendChild(a); } }; tar.ondragenter = function(event) { event = base.getEvent(event); base.preventDefault(event); this.style.backgroundColor = "red"; }; tar.ondragover = function(event) { event = base.getEvent(event); base.preventDefault(event); }; tar.ondragleave = function(event) { this.style.backgroundColor = ""; }; tar.ondrop = function(event) { event = base.getEvent(event); base.preventDefault(event); //阻止火狐的拖拽打开新的链接 base.stopPropagation(event); //阻止火狐的拖拽打开新的链接 var data = event.dataTransfer.getData("text"); var target = base.getTarget(event); if(target.id != data) { //拖动一下但是仍然在源对象不放入目标对象中时 var a = document.getElementById(data); target.appendChild(a); } }; </script> </body> </html>