-
Notifications
You must be signed in to change notification settings - Fork 0
/
readMe-drapAndDrop
146 lines (116 loc) · 3.44 KB
/
readMe-drapAndDrop
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
<ol data-draggable="target">
<li data-draggable="item">Item 0</li>
<li data-draggable="item">Item 1</li>
<li data-draggable="item">Item 2</li>
<li data-draggable="item">Item 3</li>
</ol>
<ol data-draggable="target">
<li data-draggable="item">Item 4</li>
<li data-draggable="item">Item 5</li>
</ol>
<ol data-draggable="target">
<li data-draggable="item">Item 6</li>
<li data-draggable="item">Item 7</li>
</ol>
<ol data-draggable="target">
<li data-draggable="item">Item 8</li>
</ol>
/* canvas styles */
html, body
{
font:normal normal normal 100%/1.4 tahoma, sans-serif;
background:#f9f9f9;
color:#000;
}
body
{
font-size:0.8em;
}
/* draggable targets */
[data-draggable="target"]
{
float:left;
list-style-type:none;
width:42%;
height:7.5em;
overflow-y:auto;
margin:0 0.5em 0.5em 0;
padding:0.5em;
border:2px solid #888;
border-radius:0.2em;
background:#ddd;
color:#555;
}
/* draggable items */
[data-draggable="item"]
{
display:block;
list-style-type:none;
margin:0 0 2px 0;
padding:0.2em 0.4em;
border-radius:0.2em;
line-height:1.3;
}
(function()
{
//exclude older browsers by the features we need them to support
//and legacy opera explicitly so we don't waste time on a dead browser
if
(
!document.querySelectorAll
||
!('draggable' in document.createElement('span'))
||
window.opera
)
{ return; }
//get the collection of draggable items and add their draggable attribute
for(var
items = document.querySelectorAll('[data-draggable="item"]'),
len = items.length,
i = 0; i < len; i ++)
{
items[i].setAttribute('draggable', 'true');
}
//variable for storing the dragging item reference
//this will avoid the need to define any transfer data
//which means that the elements don't need to have IDs
var item = null;
//dragstart event to initiate mouse dragging
document.addEventListener('dragstart', function(e)
{
//set the item reference to this element
item = e.target;
//we don't need the transfer data, but we have to define something
//otherwise the drop action won't work at all in firefox
//most browsers support the proper mime-type syntax, eg. "text/plain"
//but we have to use this incorrect syntax for the benefit of IE10+
e.dataTransfer.setData('text', '');
}, false);
//dragover event to allow the drag by preventing its default
//ie. the default action of an element is not to allow dragging
document.addEventListener('dragover', function(e)
{
if(item)
{
e.preventDefault();
}
}, false);
//drop event to allow the element to be dropped into valid targets
document.addEventListener('drop', function(e)
{
//if this element is a drop target, move the item here
//then prevent default to allow the action (same as dragover)
if(e.target.getAttribute('data-draggable') == 'target')
{
e.target.appendChild(item);
e.preventDefault();
}
}, false);
//dragend event to clean-up after drop or abort
//which fires whether or not the drop target was valid
document.addEventListener('dragend', function(e)
{
item = null;
}, false);
})();