Advertisement
Guest User

Untitled

a guest
Apr 26th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.74 KB | None | 0 0
  1. <!DOCTYPE html>
  2. <!--[if lt IE 7]> <html lang="en" ng-app="app" class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
  3. <!--[if IE 7]> <html lang="en" ng-app="app" class="no-js lt-ie9 lt-ie8"> <![endif]-->
  4. <!--[if IE 8]> <html lang="en" ng-app="app" class="no-js lt-ie9"> <![endif]-->
  5. <!--[if gt IE 8]><!--> <html lang="en" ng-app="app" class="no-js"> <!--<![endif]-->
  6. <head>
  7. <meta charset="utf-8">
  8. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  9. <meta name="description" content="">
  10. <meta name="viewport" content="width=device-width, initial-scale=1">
  11.  
  12. <title>External Drag Drop</title>
  13.  
  14.  
  15. <link rel="stylesheet" href="css/app.css">
  16. <link rel="stylesheet" href="css/overlays.css">
  17.  
  18. </head>
  19. <body ng-controller="appController as vmApp">
  20.  
  21. <div class="dropzone">
  22. <div id="draggable" draggable="true" ondraxgstart="event.dataTransfer.setData('text/plain',null)">
  23. This div is draggable
  24. </div>
  25. </div>
  26. <div class="dropzone"></div>
  27. <div class="dropzone"></div>
  28. <div class="dropzone"></div>
  29.  
  30. <style>
  31. #draggable {
  32. width: 200px;
  33. height: 20px;
  34. text-align: center;
  35. background: white;
  36. }
  37.  
  38. .dropzone {
  39. width: 200px;
  40. height: 20px;
  41. background: blueviolet;
  42. margin-bottom: 10px;
  43. padding: 10px;
  44. }
  45. </style>
  46.  
  47. <script>
  48. var dragged;
  49.  
  50. /* events fired on the draggable target */
  51. document.addEventListener("drag", function( event ) {
  52. console.log('drag');
  53. }, false);
  54.  
  55. document.addEventListener("dragstart", function( event ) {
  56. console.log('dragstart');
  57. // store a ref. on the dragged elem
  58. dragged = event.target;
  59. // make it half transparent
  60. event.target.style.opacity = .5;
  61. }, false);
  62.  
  63. document.addEventListener("dragend", function( event ) {
  64. console.log('dragend');
  65. // reset the transparency
  66. event.target.style.opacity = "";
  67. }, false);
  68.  
  69. /* events fired on the drop targets */
  70. document.addEventListener("dragover", function( event ) {
  71. //console.log('dragover');
  72. // prevent default to allow drop
  73. event.preventDefault();
  74. }, false);
  75.  
  76. document.addEventListener("dragenter", function( event ) {
  77. console.log('dragenter');
  78. // highlight potential drop target when the draggable element enters it
  79. if ( event.target.className == "dropzone" ) {
  80. event.target.style.background = "purple";
  81. }
  82.  
  83. }, false);
  84.  
  85. document.addEventListener("dragleave", function( event ) {
  86. console.log('dragleave');
  87. // reset background of potential drop target when the draggable element leaves it
  88. if ( event.target.className == "dropzone" ) {
  89. event.target.style.background = "";
  90. }
  91.  
  92. }, false);
  93.  
  94.  
  95.  
  96. function stringToDOM(xmlString){
  97. try{
  98. var div = document.createElement('div');
  99. div.innerHTML = xmlString;
  100. return div.childNodes[0];
  101. }
  102. catch(e){
  103. console.warn('stringToDOM > error',e);
  104. return null;
  105. }
  106. return null;
  107. }
  108.  
  109.  
  110.  
  111. function readAsDataUrlES6(single_local_file)
  112. {
  113. return new Promise(function(f,r){
  114. if(!single_local_file) {
  115. f(null);
  116. return;
  117. }
  118. var reader = new FileReader();
  119. var _successFn = function(e) { f(e.target.result); };
  120. var _failureFn = function(e) { console.error(e); f(null); };
  121. reader.onload = _successFn;
  122. reader.onabort = _failureFn;
  123. reader.onerror = _failureFn;
  124. reader.readAsDataURL(single_local_file);
  125. });
  126. }
  127.  
  128.  
  129.  
  130. function readFilesAsDataURL(files,dataUrls,_counter)
  131. {
  132. if(!files) files=[];
  133. if(!dataUrls) dataUrls=[];
  134. if(_counter==null || _counter==undefined) _counter=files.length-1;
  135.  
  136. return readAsDataUrlES6(files[_counter]).then(function(dataUrl){
  137. if(!dataUrl) return dataUrls;
  138.  
  139. dataUrls.push(dataUrl);
  140.  
  141. return readFilesAsDataURL(files,dataUrls,_counter-1);
  142. });
  143. }
  144.  
  145.  
  146.  
  147. function DroppedFileClass(){
  148. this.name = null;
  149. this.bytes = null;
  150. this.timestamp = null;
  151. this.mime_type = null;
  152. this.src = null;
  153. this.source = null;
  154.  
  155. this.isLocalSource = function(){ return this.source === 'Local'; };
  156. this.isRemoteSource = function(){ return this.source === 'Remote'; };
  157. this.setLocalSource = function(){ this.source = 'Local'; };
  158. this.setRemoteSource = function(){ this.source = 'Remote'; };
  159.  
  160. this.setSrc = function(src){
  161. this.src = src;
  162. if(!src) return;
  163.  
  164. // Remote
  165. if(src.indexOf('http')>=0){
  166. var j = src.lastIndexOf('/');
  167. if(j>=0){ this.name = src.substr(j+1); }
  168. j = src.lastIndexOf('.');
  169. if(j>=0){ this.mime_type = src.substr(j+1); }
  170. }
  171. }
  172. }
  173.  
  174.  
  175.  
  176. function prepareDroppedFiles(e,files){
  177. var _files = files;
  178. if(!_files) _files=[];
  179.  
  180. var target_files = (e.target.files || e.dataTransfer.files || e.originalEvent.dataTransfer.files);
  181.  
  182. var target_getdata = function(mime_type){
  183. if(e.target.getData) return e.target.getData(mime_type);
  184. if(e.dataTransfer.getData) return e.dataTransfer.getData(mime_type);
  185. if(e.originalEvent.dataTransfer.getData) return e.originalEvent.dataTransfer.getData(mime_type);
  186. return null;
  187. };
  188.  
  189. var _newfile=null;
  190.  
  191. if(target_files.length>0){
  192. for(var i=0; i<target_files.length; i++){
  193. _newfile = new DroppedFileClass();
  194. _newfile.setLocalSource();
  195. _newfile.name = target_files[i].name;
  196. _newfile.bytes = target_files[i].size;
  197. _newfile.timestamp = target_files[i].lastModified;
  198. _newfile.mime_type = target_files[i].type;
  199. _files.push(_newfile);
  200. }
  201. }
  202.  
  203. if(target_getdata){
  204. var _element = target_getdata('text/html');
  205. if(_element && _element.length>0){
  206. var _dom_element = stringToDOM(_element);
  207. if(_dom_element){
  208. _newfile = new DroppedFileClass();
  209. _newfile.setRemoteSource();
  210. _newfile.setSrc(_dom_element.getAttribute('src'));
  211. _files.push(_newfile);
  212. }
  213. }
  214. }
  215. return _files;
  216. }
  217.  
  218.  
  219.  
  220. function getDroppedFiles(e){
  221. var dropped_files = prepareDroppedFiles(e);
  222.  
  223. return readFilesAsDataURL(dropped_files.local_files).then(function(array){
  224. if(!array || array.length<=0) return dropped_files;
  225.  
  226. for(var i=0; i<array.length; i++){
  227. dropped_files.local_files[i].setSrc(array[i]);
  228. }
  229.  
  230. return dropped_files;
  231. });
  232. }
  233.  
  234.  
  235.  
  236. document.addEventListener("drop", function( e ) {
  237. // prevent default action (open as link for some elements)
  238. console.log(e);
  239. e.preventDefault();
  240.  
  241. getDroppedFiles(e).then(function(dropped_files){
  242. console.log('Dropped Files',dropped_files);
  243. });
  244.  
  245.  
  246. // move dragged elem to the selected drop target
  247. /*if ( e.target.className == "dropzone" ) {
  248. e.target.style.background = "";
  249. dragged.parentNode.removeChild( dragged );
  250. e.target.appendChild( dragged );
  251. }*/
  252.  
  253. }, false);
  254. </script>
  255.  
  256. </body>
  257. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement