javascript - Firefox no muestra la imagen en la vista previa fantasma de arrastrar y soltar
html css (2)
Estoy intentando mostrar el elemento fantasma en lugar de la vista previa predeterminada del navegador para arrastrar y soltar. El problema es que en la imagen de Firefox dentro del elemento fantasma no se muestra mientras se arrastra. Pero si lo suelto, y arrastro de nuevo la imagen se muestra.
Así que creo que esto podría ser algún tipo de problema relacionado con el caché. Pero no puedo ver cómo puedo pre-cachear la imagen en este caso.
Aquí está el código:
// 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/
Pasos para reproducir:
1) abrir el fragmento de violín / correr
2) tratar de arrastrar la imagen de muestra
Actual: verás un cuadrado vacío con borde rojo.
Espera: plaza con imagen interior.
Para volver a reproducirlo, debes forzar la recarga de la página (ctrl + f5). Es por eso que creo que esto es un problema de caché.
Nota: Sé que debo eliminar el elemento fantasma de DOM en el controlador de arrastre, pero esto no es importante aquí.
Actualizar:
1) el caso de uso real incluye la vista con una gran cantidad de imágenes (~ 500), por lo que no es una opción para guardar en caché las imágenes a través de js.
2) Para los que no pudieron reproducir el problema, aquí está la captura de pantalla: al principio, se ve la vista previa después de la recarga (ctrl + f5), y luego el segundo intento de arrastre. Tenga en cuenta que en ambos casos no se ven solicitudes de http en la pestaña de red en el inspector web.
En css
establezca .parent
pseudo class :hover
y .element
background
en url("/path/to/image")
para buscar la imagen en :hover
de <img class="element" src="http://www.thekrausemouse.com/wp-content/uploads/2016/03/Sample.jpg" draggable="true" />
elemento padre. En el evento dragstart
, configure div
.className
como "element"
.
.element {
width: 100px;
height: 100px;
background: url("http://www.thekrausemouse.com/wp-content/uploads/2016/03/Sample.jpg");
background-size: 100px 100px;
}
.parent:hover {
background: url("http://www.thekrausemouse.com/wp-content/uploads/2016/03/Sample.jpg");
background-size: 0px 0px;
}
<div class="parent container">
<img class="element" src="http://www.thekrausemouse.com/wp-content/uploads/2016/03/Sample.jpg" draggable="true" />
</div>
<script>
function handleImage(e) {
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'';
div.className = "element";
document.body.appendChild(div);
e.dataTransfer.setData(''text/plain'', ''test'');
e.dataTransfer.setDragImage(div, 0, 0);
}
document.querySelector(".element")
.addEventListener("dragstart", handleImage, false);
</script>
jsfiddle https://jsfiddle.net/etseq5cg/7/
No puedo ver el problema cuando ejecuto https://jsfiddle.net/etseq5cg/5/ en Firefox 53 (en Windows 7). La imagen fantasma y la imagen arrastrada tienen la misma URL y la imagen fantasma siempre se muestra al arrastrar. Sin embargo, puedo reproducir el problema con una imagen fantasma que tiene una URL diferente.
Podría agregar un control img
oculto para precargar la imagen fantasma. Algo como esto:
<div class="parent container">
<img class="element" draggable="true" src="http://the.element.image" />
<img class="imgGhost" src="http://the.ghost.image" />
</div>
Según mis pruebas, estas configuraciones impiden la precarga de la imagen en Firefox:
- Ocultando el elemento con
display: none
- Configuración de un tamaño nulo (
width: 0px
oheight: 0px
) -
left: -10000px
fuera de la ventanaleft: -10000px
(por ejemplo, a laleft: -10000px
)
Tampoco tuve mucho éxito con la precarga de enlaces . Sin embargo, la visibility: hidden
parece funcionar. El estilo del elemento de imagen oculta podría definirse como:
.imgGhost {
position: absolute;
left: 0px;
top: 0px;
visibility: hidden;
}
El método se puede probar para dos imágenes arrastrables en este jsfiddle . En el dragstart
eventos dragstart
, la URL de la imagen se recupera del elemento oculto:
img.src = this.parentNode.querySelector(".imgGhost").src;
Pero podría ser difícil de codificar. Si lo prefiere, puede establecer el atributo src
de la imagen oculta dinámicamente cuando se carga la página. Al probar en el archivo jsfiddle, puede cambiar los nombres de las imágenes fantasma (p. Ej., 225x225) antes de volver a ejecutarla, para asegurarse de que la imagen no se haya guardado en la memoria caché.
También puede forzar un repintado del diseño después de agregar el control div
al body
en el controlador de eventos dragstart
. Esto se puede lograr llamando a div.offsetHeight
:
div.appendChild(img);
document.body.appendChild(div);
div.offsetHeight; // Force repaint