开始拖动, dragstart 事件发生,使用 setData() 方法把要拖动的数据存入 DataTransfer 。
DataTransfer 对象专门用来储存拖放元素操作时要传输的数据,可以通过拖放元素对象的 dataTransfer 属性进行访问。 DataTransfer 对象有两个重要的方法: settData() 和 getData() 。其中, setData 方法倾向于 DataTransfer 对象传递值,而另一个是读取值。
setData() 方法的第一个参数为携带数据的类型( MIME ,),第二个参数为要携带额外数据。
dt.setData('text/plain', this.id);
针对拖放的目标对象,应该在 dragend 或 dragover 事件内调用事件对象的 preventDefault() 方法阻止默认执行为
dest.addEventListener(
'dragend',
function (event) {
event.preventDefault();
},
false,
);
给目标对象接受被拖放元素后,执行 getData() 方法从 DataTransfer 对象获取数据。 getData() 方法包含一个参数,参数为 setData() 方法中指定的数据类型,如 "text/plain"
要实现拖放过程,还需要在目标元素的 drop 事件中关闭默认行为处理。,否则不接受被拖放元素
dest.addEventListener(
'drop',
function (event) {
event.preventDefault();
event.stopPropagation();
},
false,
);
要实现拖放,还应设置真整个页面的不执行默认处理,否则拖放处理无法进行
document.ondragover = function (event) {
event.preventDefault();
};
document.ondrop = function (event) {
event.preventDefault();
};
<head>
<style>
#drag {
width: 200px;
height: 200px;
background-color: #f0f;
border-radius: 12px;
text-align: center;
line-height: 200px;
color: #ff0;
}
#target {
position: relative;
left: 1000px;
top: 100;
width: 400px;
height: 400px;
border: 1px dotted #00f;
margin: -100px 12px 12px; /* float: right; */
overflow: auto;
padding: 2rem 0;
}
#target h1 {
text-align: center;
width: 100%;
position: relative; /* background-color: #; */
z-index: 100;
top: 0;
left: 0;
text-align: center;
color: #0f0;
margin: 6px 0;
font-size: 16px;
}
</style>
</head>
<body>
<div id="drag" draggable="true">圆圆的屁股</div>
<div id="target"><h1>大大的脸</h1></div>
</body>
<script>
function init() {
let source = mi('drag');
let dest = mi('target');
e(source, 'dragstart', function (event) {
let d = event.dataTransfer;
d.effectAllowed = 'all';
d.setData('text/plain', this.innerHTML);
});
e(dest, 'dragend', function (event) {
event.preventDefault();
});
e(dest, 'drop', function (event) {
var t = event.dataTransfer;
var x = t.getData('text/plain');
dest.innerHTML += '<p>' + x + '</p>';
event.preventDefault();
event.stopPropagation();
});
}
init();
document.ondragover = function (event) {
event.preventDefault();
};
document.ondrop = function (event) {
event.preventDefault();
};
function mi(id) {
return document.querySelector('#' + id);
}
function e(n, event, fn) {
if (n.nodeType != 1 && mi(n) != null) {
n = mi(n);
} else if (n.nodeType == 1) {
n = n;
} else if (n.nodeType != 1 && mi(n) == null) {
throw new Error('为捕获元素');
}
if (n.addEventListener) {
n.addEventListener(event, fn, false);
} else if (n.attachEvent) {
n.attachEvent('on' + event, fn);
} else {
n['on' + event] = fn;
}
}
</script>