Tôi đang cố gắng hiển thị phần tử ma thay vì xem trước trình duyệt mặc định để kéo và thả. Vấn đề là trong hình ảnh firefox bên trong phần tử ma không được hiển thị trong khi kéo. Nhưng nếu tôi thả nó và kéo lại hình ảnh là được hiển thị.Firefox không hiển thị hình ảnh trong chế độ xem kéo và thả ma
Vì vậy, tôi nghĩ rằng đây có thể là một số vấn đề liên quan đến bộ nhớ cache. Nhưng tôi không thể thấy cách tôi có thể lưu trước hình ảnh trong trường hợp này.
Dưới đây là các mã:
// 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);
Fiddle: https://jsfiddle.net/etseq5cg/5/
bước để tái sản xuất:
1) mở fiddle/chạy đoạn
2) cố gắng kéo hình ảnh mẫu
thực tế: bạn sẽ thấy một hình vuông rỗng với đường viền màu đỏ
dự kiến: hình vuông với hình ảnh bên trong.
Để tái tạo lại, bạn cần buộc tải lại trang (ctrl + f5). Đó là lý do tại sao tôi nghĩ rằng đây là vấn đề về bộ nhớ cache.
Lưu ý: Tôi biết rằng tôi nên xóa phần tử ma khỏi DOM trong trình xử lý kéo, nhưng điều này không quan trọng ở đây.
Cập nhật:
1) việc sử dụng hợp cụ thể thực tế bao gồm quan điểm với số lượng lớn các hình ảnh (~ 500), vì vậy nó không phải là một tùy chọn để pre-cache hình ảnh qua js.
2) Đối với những người không thể tạo lại vấn đề, dưới đây là ảnh chụp màn hình: lúc đầu bạn thấy bản xem trước sau khi tải lại cứng (ctrl + f5) và sau đó là lần thử kéo thứ hai. Xin lưu ý rằng không có yêu cầu http nào được nhìn thấy trong tab mạng trong thanh tra web trong cả hai trường hợp.
Vấn đề bạn gặp phải là hình ảnh của bạn đã được nạp sau khi div được gắn vào cơ thể của bạn. Bạn có thể sử dụng hình ảnh 'onload' để chờ tải hình ảnh, hãy xem câu trả lời này: http://stackoverflow.com/questions/12354865/image-onload-event-and-browser-cache. Thay vào đó, bạn có thể tạo phần tử trước khi người dùng kéo phần tử (trên tải trang), do đó bạn không cần phải xử lý việc chờ tải hình ảnh. –
@ toggy-tog-togs Tôi không thể đợi sự kiện tải hình ảnh vì đây là hoạt động không đồng bộ và gọi 'setDragImage' là đồng bộ hóa. Vì vậy, nếu tôi gọi 'setDragImage' bên trong 'onload' gọi lại nó sẽ không làm bất cứ điều gì. Và như bạn có thể thấy chính hình ảnh đã được thêm vào DOM (tôi sử dụng cùng một hình ảnh để xem trước và dnd ghost). – Rasalom
Tôi đã thử jsfiddle trong Firefox.Khi tôi kéo hình ảnh "Mẫu", tôi thấy hình ảnh ma "Mẫu". – ConnorsFan