drag-and-drop.js | |
---|---|
Searching Google for good examples of processing files with HTML5's drag
and drop proved to be more difficult than I anticipated. This example
exists to provide both a solid starting point for any other nerds looking
to implement drag and drop as well as provide detailed contextual
documentation for working with drag and drop events, the JavaScript
This example's source is hosted on github, feel free to send me any pull requests or report any issues. Caveats
Reference
The MarkupThis script expects a tiny bit of markup to subject to it's event listening and DOM manipulation (for the entire page take a look at this project's index.html):
The | |
The JavaScript | |
Set a reference the the
Is eqiuivelent to:
Notice that using the query above requires the zeroth element from the
jQuery object. This is so that the node can be acted on directly with
| var dropbox = document.getElementById('dropbox'); |
Using an EventListener object | |
It is good practice when needing to keep state and provide encapsulation
between multiple events to use the | var dropListener = { |
Since | handleEvent: function(event){
if (event.type === 'dragenter') { this.onDragEnter(event); }
if (event.type === 'dragexit') { this.onDragExit(event); }
if (event.type === 'dragover') { this.onDragOver(event); }
if (event.type === 'drop') { this.onDragDrop(event); }
}, |
| onDragEnter: function(event){
event.preventDefault();
event.stopPropagation();
console.debug('enter')
}, |
| onDragExit: function(event){
event.preventDefault();
event.stopPropagation();
}, |
| onDragOver: function(event){
event.preventDefault();
event.stopPropagation();
}, |
| onDragDrop: function(event){
event.preventDefault();
event.stopPropagation(); |
The | var files = event.dataTransfer.files,
file = files; |
If there are any files the | if (files.length) {
file = files[0];
document.getElementById('droplabel').innerHTML = 'Processing ' +
file.name;
this.processImage(file);
}
}, |
| processImage: function(file){
if (! file.type.match('image.*')) {
document.getElementById('droplabel').innerHTML = file.name +
' is not an image.';
return;
} |
If the file is an image a new | var reader = new FileReader(); |
| reader.onloadend = this.onReaderLoadEnd; |
| reader.readAsDataURL(file);
}, |
| onReaderLoadEnd: function(event){
var img = document.getElementById("preview");
img.src = event.target.result;
}
}; |
Adding drag and drop event listeners | |
Use | dropbox.addEventListener('dragenter', dropListener, false);
dropbox.addEventListener('dragexit', dropListener, false);
dropbox.addEventListener('dragover', dropListener, false);
dropbox.addEventListener('drop', dropListener, false); |
Piece of cake right? | |