如何在拖拽/拖放期间更改图标 HTML 5 拖放

Mou*_*ssa 6 html javascript angularjs

如何在 Dragover 或 Dragenter 过程中更改 DnD(拖放)图标?有可能吗?

如果拖放源位于 html 页面内部(例如将一个 div 拖到另一个 div 中),我可以在拖拽启动期间更改图标。这是我的代码,我正在使用 Angular,我设置了一个plunker

app.directive('drag', function() {
  return {
    link: function(scope, element, attr) {
      element.attr('draggable', true);
      element.css('cursor', 'move');

      element.bind('dragstart', function(event) {
        console.log('dragstart');
        console.log(event.dataTransfer);
        event.dataTransfer.effectAllowed = 'move';

        var img = document.createElement("img");
        img.src = "https://image.flaticon.com/teams/slug/google.jpg";
        event.dataTransfer.setDragImage(img, 0, 0);
      });
    }
  };
});
Run Code Online (Sandbox Code Playgroud)

但如果源是文件或网址,则更改图标不起作用,这是代码。我试图在拖拽或拖拽期间更改图标。

element.bind('dragenter', function(event) {
  console.log('dragenter');
  event.dataTransfer.effectAllowed = 'move';

  var img = document.createElement("img");
  img.src = "https://image.flaticon.com/teams/slug/google.jpg";
  event.dataTransfer.setDragImage(img, 0, 0);
});

element.bind('dragover', function(event) {

  if (event.preventDefault) {
    event.preventDefault();
  }

  if (event.stopPropagation) {
    event.stopPropagation();
  }

  console.log('dragover');

  element.addClass('dragged');

  var img = document.createElement("img");
  img.src = "https://image.flaticon.com/teams/slug/google.jpg";
  event.dataTransfer.setDragImage(img, 0, 0);

  return false;
});
Run Code Online (Sandbox Code Playgroud)

Jul*_*ire 6

根据规范,您不能在拖动开始以外的事件上使用setDragImage 。请参阅此处:https://html.spec.whatwg.org/multipage/dnd.html#dom-datatransfer-setdragimage

setDragImage(element, x, y) 方法必须运行以下步骤:

  1. 如果 DataTransfer 对象不再与拖动数据存储关联,则返回。什么都没发生。

  2. 如果拖动数据存储的模式不是读/写模式,则返回。什么都没发生。

  3. 如果元素是 img 元素,则将拖动数据存储位图设置为该元素的图像(以其固有大小);否则,将拖动数据存储位图设置为从给定元素生成的图像(当前未指定执行此操作的确切机制)。

  4. 将拖动数据存储热点坐标设置为给定的 x、y 坐标。

在这里,您可以看到拖动数据存储仅在dragstart上处于读/写模式: https: //html.spec.whatwg.org/multipage/dnd.html#concept-dnd-rw

读/写模式 用于dragstart 事件。新数据可以添加到拖动数据存储中。

这些模式是出于安全原因而存在的,您可以在拖放的不同阶段执行一些操作。

  • 另一种选择是“setDragImage(new Image(), 9999, 0)”,然后实现用鼠标跟踪的自定义叠加层。我为 [JS File Explorer](https://github.com/cubiclesoft/js-fileexplorer) 做了类似的事情。它并没有完全从头开始实现 D&D,因为它仍然具有跨窗口/选项卡 D&D 和拖拽启动/输入/结束/等的优点。而 mousedown/mousemove 样式的解决方案仅适用于当前窗口/选项卡。 (2认同)