Ich habe ein HTML object
( embed
), das die Breite und Höhe der Seite ausfüllt. Die Antwort von @ digital-plane funktioniert auf normalen Webseiten, jedoch nicht, wenn der Benutzer auf ein eingebettetes Objekt fällt. Also brauchte ich eine andere Lösung.
Wenn wir zur Ereigniserfassungsphase wechseln, können wir true
die Ereignisse abrufen, bevor das eingebettete Objekt sie empfängt (beachten Sie den Wert am Ende des Aufrufs des Ereignis-Listeners):
// 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);
Mit dem folgenden Code (basierend auf der Antwort von @ digital-plane) wird die Seite zu einem Ziehziel. Sie verhindert, dass Objekteinbettungen die Ereignisse erfassen, und lädt dann unsere Bilder:
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);
Getestet auf Firefox auf Mac.