drag-and-drop.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. const handlers = {
  2. onDropFile: () => {},
  3. };
  4. export function setup( options ) {
  5. const html = `
  6. <style>
  7. .dragInfo {
  8. position: fixed;
  9. left: 0;
  10. top: 0;
  11. width: 100%;
  12. height: 100%;
  13. background: rgba(0, 0, 0, .9);
  14. display: flex;
  15. align-items: center;
  16. justify-content: center;
  17. }
  18. .dragInfo>div {
  19. padding: 1em;
  20. background: blue;
  21. color: white;
  22. pointer-events: none;
  23. }
  24. .dragerror div {
  25. background: red !important;
  26. font-weight: bold;
  27. color: white;
  28. }
  29. </style>
  30. <div class="dragInfo" style="display: none;">
  31. <div>
  32. ${options.msg}
  33. </div>
  34. </div>
  35. `;
  36. const elem = document.createElement( 'div' );
  37. elem.innerHTML = html;
  38. document.body.appendChild( elem );
  39. const dragInfo = document.querySelector( '.dragInfo' );
  40. function showDragInfo( show ) {
  41. dragInfo.style.display = show ? '' : 'none';
  42. }
  43. document.body.addEventListener( 'dragenter', () => {
  44. showDragInfo( true );
  45. } );
  46. const dragElem = dragInfo;
  47. dragElem.addEventListener( 'dragover', ( e ) => {
  48. e.preventDefault();
  49. return false;
  50. } );
  51. dragElem.addEventListener( 'dragleave', () => {
  52. showDragInfo( false );
  53. return false;
  54. } );
  55. dragElem.addEventListener( 'dragend', () => {
  56. showDragInfo( false );
  57. return false;
  58. } );
  59. dragElem.addEventListener( 'drop', ( e ) => {
  60. e.preventDefault();
  61. showDragInfo( false );
  62. if ( e.dataTransfer.items ) {
  63. let fileNdx = 0;
  64. for ( let i = 0; i < e.dataTransfer.items.length; ++ i ) {
  65. const item = e.dataTransfer.items[ i ];
  66. if ( item.kind === 'file' ) {
  67. handlers.onDropFile( item.getAsFile(), fileNdx ++ );
  68. }
  69. }
  70. }
  71. return false;
  72. } );
  73. }
  74. export function onDropFile( fn ) {
  75. handlers.onDropFile = fn;
  76. }