Skip to content

Commit 8fffa9c

Browse files
committed
拖动api练习
1 parent 285093f commit 8fffa9c

File tree

1 file changed

+154
-0
lines changed

1 file changed

+154
-0
lines changed

_posts/2025-08-09-mdn-drag.md

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
---
2+
title: 拖动API练习
3+
---
4+
5+
6+
7+
<style>
8+
.drag-ctx div {
9+
border: 1px solid rgba(255, 0, 0, 0.2);
10+
}
11+
12+
.drag-ctx {
13+
display: flex;
14+
gap: 16px;
15+
}
16+
17+
.source-item {
18+
width: 200px;
19+
height: 100px;
20+
}
21+
22+
.dropzone {
23+
width: 200px;
24+
height: 200px;
25+
26+
}
27+
28+
.dragging {
29+
background: blue;
30+
}
31+
32+
.msg {
33+
flex: 1;
34+
background-color: pink;
35+
opacity: 0.9;
36+
overflow: auto;
37+
max-height: 50vh;
38+
}
39+
</style>
40+
<div class="drag-ctx">
41+
42+
<div draggable="true" class="source source-item">可拖动的元素</div>
43+
44+
<div class="source-item">
45+
选择拖动文本
46+
<input type="text" value="选择拖动文本内容">
47+
</div>
48+
49+
<div class="source-item">可拖动的图片
50+
<img src="./logo.svg" width="100"/>
51+
</div>
52+
53+
<div class="source-item">
54+
<a href="https://www.baidu.com">可拖动地址</a>
55+
</div>
56+
57+
58+
</div>
59+
60+
<div class="drag-ctx">
61+
62+
<div class="dropzone">
63+
目标放置
64+
</div>
65+
66+
<div class="msg">
67+
68+
</div>
69+
</div>
70+
<script>
71+
function log(text, ...data) {
72+
let ele = document.createElement("div");
73+
ele.textContent = JSON.stringify(data);
74+
75+
let tele = document.createElement("div");
76+
tele.textContent = text;
77+
78+
let msg = document.querySelector('.msg')
79+
msg.appendChild(tele);
80+
msg.appendChild(ele)
81+
82+
msg.scrollTop = msg.scrollHeight;
83+
84+
console.log(text, ...data);
85+
}
86+
87+
function show_data(event, title) {
88+
89+
console.log(title, event.dataTransfer);
90+
91+
let dt = event.dataTransfer;
92+
93+
for (let type of dt.types) {
94+
log(`${title}数据获取`, type, dt.getData(type));
95+
}
96+
for (let item of dt.items) {
97+
let file = item.getAsFile()
98+
if (file) {
99+
log(`${title}数据文件`, file, item)
100+
} else {
101+
item.getAsString((str) => {
102+
log(`${title}字符串`, str)
103+
})
104+
}
105+
106+
}
107+
108+
}
109+
110+
let source = document.querySelector('.source');
111+
// 源开始
112+
source.addEventListener('dragstart', e => {
113+
e.target.classList.add('dragging');
114+
let id = Math.random() + '.id'
115+
e.dataTransfer.setData('text', id)
116+
log('设置id', {id})
117+
})
118+
119+
// 源开始, 频率太高, 不处理
120+
source.addEventListener('drag', e => {
121+
})
122+
123+
// 源结束
124+
source.addEventListener('dragend', e => {
125+
log("拖动完成?", e.dataTransfer.dropEffect);
126+
e.target.classList.remove('dragging');
127+
128+
129+
debugger
130+
show_data(e, 'end')
131+
132+
})
133+
134+
135+
let drope = document.querySelector('.dropzone');
136+
drope.addEventListener('dragenter', e => {
137+
e.preventDefault()
138+
log('进入', e.dataTransfer.dropEffect);
139+
e.target.classList.add('dragging');
140+
})
141+
drope.addEventListener('dragleave', e => {
142+
e.target.classList.remove('dragging');
143+
log('离开', e.dataTransfer.dropEffect);
144+
})
145+
drope.addEventListener('dragover', (e) => {
146+
e.preventDefault();
147+
e.dataTransfer.dropEffect = 'copy';
148+
})
149+
drope.addEventListener('drop', (e) => {
150+
e.preventDefault();
151+
e.target.classList.remove('dragging');
152+
show_data(e, 'drop')
153+
})
154+
</script>

0 commit comments

Comments
 (0)