Tengo un HTML object
( embed
) que llena el ancho y el alto de la página. La respuesta de @ digital-plane funciona en páginas web normales, pero no si el usuario cae sobre un objeto incrustado. Entonces necesitaba una solución diferente.
Si cambiamos al uso de la fase de captura de eventos , podemos obtener los eventos antes de que el objeto incrustado los reciba (observe el true
valor al final de la llamada de escucha de eventos):
// document.body or window
document.body.addEventListener("dragover", function(e){
e = e || event;
e.preventDefault();
console.log("over true");
}, true);
document.body.addEventListener("drop", function(e){
e = e || event;
e.preventDefault();
console.log("drop true");
}, true);
Usando el siguiente código (basado en la respuesta de @ digital-plane) la página se convierte en un objetivo de arrastre, evita que las incrustaciones de objetos capturen los eventos y luego carga nuestras imágenes:
document.body.addEventListener("dragover", function(e){
e = e || event;
e.preventDefault();
console.log("over true");
}, true);
document.body.addEventListener("drop",function(e){
e = e || event;
e.preventDefault();
console.log("Drop true");
// begin loading image data to pass to our embed
var droppedFiles = e.dataTransfer.files;
var fileReaders = {};
var files = {};
var reader;
for (var i = 0; i < droppedFiles.length; i++) {
files[i] = droppedFiles[i]; // bc file is ref is overwritten
console.log("File: " + files[i].name + " " + files[i].size);
reader = new FileReader();
reader.file = files[i]; // bc loadend event has no file ref
reader.addEventListener("loadend", function (ev, loadedFile) {
var fileObject = {};
var currentReader = ev.target;
loadedFile = currentReader.file;
console.log("File loaded:" + loadedFile.name);
fileObject.dataURI = currentReader.result;
fileObject.name = loadedFile.name;
fileObject.type = loadedFile.type;
// call function on embed and pass file object
});
reader.readAsDataURL(files[i]);
}
}, true);
Probado en Firefox en Mac.