我正在嘗試顯示ghost元素而不是默認瀏覽器預覽以進行拖放操作。問題在於,在拖動時不顯示ghost元素中的firefox圖像。但是,如果我放下它,並再次拖動圖像顯示爲。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)開放小提琴/運行片斷
2)嘗試拖動樣品圖像
實際:你會看到一個空方用紅色邊框
預計:正方形圖像內。
要重現它,你需要強制重載頁面(ctrl + f5)。這就是爲什麼我認爲這是緩存相關問題。
注:我知道我應該從dragend處理程序中的DOM中刪除ghost元素,但這裏並不重要。
更新:
1)在實際使用情況下的包括考慮到與圖像的大量(〜500),所以它不是通過JS預先高速緩存的圖像的選項。
2)對於那些不能重現問題的人,下面是屏幕截圖:首先,您在硬重載(ctrl + f5)之後看到預覽,然後是第二次拖動嘗試。請注意,在這兩種情況下,web檢查器的網絡選項卡中都沒有看到http請求。
您所遇到的問題是div追加到你的身體後,你的形象被載入。你可以使用'onload'來等待圖像加載,看看這個答案:http://stackoverflow.com/questions/12354865/image-onload-event-and-browser-cache。您可以在用戶拖動元素之前創建元素(在頁面加載時),因此您不必處理等待加載圖像的操作。 –
@ toggy-tog-togs我不能等待圖像onload事件,因爲這是異步操作,並調用'setDragImage'是同步的。所以如果我在'onload'回調中調用'setDragImage',它不會做任何事情。 而且你可以看到圖像本身已經添加到DOM(我使用相同的圖像預覽和dnd鬼)。 – Rasalom
我嘗試了Firefox中的jsfiddle。當我拖動「Sample」圖像時,我看到「Sample」重影圖像。 – ConnorsFan