-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdrag.js
112 lines (103 loc) · 3.77 KB
/
drag.js
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
/**
* Created by zouxuan on 4/27/17.
*/
(function (global) {
'use strict';
var dragTarget=null;
var dragType=null;
var scriptBlocks=[];
function dragStart(event) {
if(!matches(event.target,'.block')){
return;
}
if(matches(event.target,'.menu .block')){
dragType='menu';
}else{
dragType='script';
}
event.target.classList.add('dragging');
dragTarget=event.target;
scriptBlocks=[].slice.call(document.querySelectorAll('.script .block:not(.dragging)'));
event.dataTransfer.setData('text/html', event.target.outerHTML);
if(matches(event.target,'.menu .block')){
event.dataTransfer.effectAllowed='copy';
}else{
event.dataTransfer.effectAllowed='move';
}
}
function dragOver(event) {
if(!matches(event.target,'.menu, .menu *, .script, .script *, .content')){
return;
}
if(event.preventDefault){
event.preventDefault();
}
if(dragType==='menu'){
event.dataTransfer.dropEffect='copy';
}else{
event.dataTransfer.dropEffect='move';
}
return false;
}
function drop(event){
if(!matches(event.target,'.menu, .menu *, .script, .script *')){
return;
}
var dropTarget=closest(event.target,'.script .container, .script .block, .menu, .script');
var dropType='script';
if (matches(dropTarget, '.menu')){ dropType = 'menu'; }
if(event.stopPropagation){
event.stopPropagation();
}
if(dragType==='script'&&dropType==='menu'){
trigger('blockRemoved',dragTarget.parentElement,dragTarget);
dragTarget.parentElement.removeChild(dragTarget);
}
else if(dragType==='script'&&dropType==='script'){
if(matches(dropTarget,'.block')){
dropTarget.parentElement.insertBefore(dragTarget,dropTarget.nextSibling);
}else{
dropTarget.insertBefore(dragTarget,dropTarget.firstChildElement);
}
trigger('blockMoved', dropTarget, dragTarget);
}
else if (dragType === 'menu' && dropType === 'script'){
var newNode = dragTarget.cloneNode(true);
newNode.classList.remove('dragging');
if (matches(dropTarget, '.block')){
dropTarget.parentElement.insertBefore(
newNode, dropTarget.nextSibling);
}else{
dropTarget.insertBefore(newNode, dropTarget.firstChildElement);
}
trigger('blockAdded', dropTarget, newNode);
}
}
function dragEnter(evt){
if (matches(evt.target, '.menu, .script, .content')){
evt.target.classList.add('over');
if (evt.preventDefault) { evt.preventDefault(); }// Necessary. Allows us to drop.
}else{
if (!matches(evt.target, '.menu *, .script *')){
_findAndRemoveClass('over');
evt.target.classList.remove('over');
}
}
return false;
}
function _findAndRemoveClass(klass){
var elem = document.querySelector('.' + klass);
if (elem){ elem.classList.remove(klass); }
}
function dragEnd(evt){
_findAndRemoveClass('dragging');
_findAndRemoveClass('over');
_findAndRemoveClass('next');
}
document.addEventListener('dragstart', dragStart, false);
document.addEventListener('dragenter', dragEnter, false);
document.addEventListener('dragover', dragOver, false);
document.addEventListener('drag', function(){}, false);
document.addEventListener('drop', drop, false);
document.addEventListener('dragend', dragEnd, false);
})(window);