普通版

跨浏览器兼容拖动事件,兼容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>