【发布时间】:2017-10-02 19:04:35
【问题描述】:
我正在尝试显示幽灵元素而不是默认浏览器预览以进行拖放。问题是在拖动时不显示幽灵元素内的Firefox图像。但是,如果我放下它,然后再次拖动图像 就会显示出来。
所以我认为这可能是某种与缓存相关的问题。但是在这种情况下我看不到如何预先缓存图像。
代码如下:
//html:
<div class="parent container">
<img class="element" src="http://www.thekrausemouse.com/wp-content/uploads/2016/03/Sample.jpg" draggable="true" />
</div>
//js:
document.querySelector(".element").addEventListener("dragstart", function(e) {
var img = document.createElement("img");
var div = document.createElement('div');
div.style.width = '100px';
div.style.height = '100px';
div.style.position = 'fixed';
div.style.top = '-1000000px';
div.style.left = '-1000000px';
div.style.border = '2px solid red';
img.src = "http://www.thekrausemouse.com/wp-content/uploads/2016/03/Sample.jpg";
img.style.width = '100px';
img.style.height = '100px';
div.appendChild(img);
document.body.appendChild(div);
e.dataTransfer.setData('text/plain', 'test');
e.dataTransfer.setDragImage(div, 0, 0);
}, false);
小提琴: https://jsfiddle.net/etseq5cg/5/
重现步骤:
1) 打开 fiddle/运行 sn-p
2) 尝试拖动示例图片
实际:你会看到一个带有红色边框的空方块
预期:正方形,里面有图片。
要再次重现它,您需要强制重新加载页面(ctrl+f5)。这就是为什么我认为这是与缓存相关的问题。
注意:我知道我应该在 dragend 处理程序中从 DOM 中删除 ghost 元素,但这在这里并不重要。
更新:
1) 实际用例包括包含大量图像(~500)的视图,因此不能通过 js 预缓存图像。
2) 对于那些无法重现问题的人,这里是截图:首先你看到硬重载(ctrl+f5) 后的预览,然后是第二次拖动尝试。请注意,在这两种情况下,网络检查器的网络选项卡中都没有看到 http 请求。
【问题讨论】:
-
您遇到的问题是在将 div 附加到您的身体后正在加载您的图像。您可以使用图像
onload等待图像加载,看看这个答案:stackoverflow.com/questions/12354865/…。您可以在用户拖动元素之前(在页面加载时)创建元素,这样您就不必等待图像加载。 -
@toggy-tog-togs 我等不及图像加载事件,因为这是异步操作,调用“setDragImage”是同步的。因此,如果我在“onload”回调中调用“setDragImage”,它不会做任何事情。如您所见,图像本身已添加到 DOM(我使用相同的图像进行预览和 dnd ghost)。
-
我在 Firefox 中尝试了 jsfiddle。当我拖动“Sample”图像时,我看到了“Sample”重影图像。
-
@ConnorsFan 我添加了“更新”部分,其中包含我所得到的截图。
标签: javascript html css firefox drag-and-drop