JavaScript. Подробное руководство, 6-е издание, стр. 391
Пример 22.10 демонстрирует два важных приема. Во-первых, он реализует «площадку для сброса», которая обрабатывает события механизма буксировки мышью (drag-and-drop), имеющие отношение к файлам. Во-вторых, когда пользователь сбросит один или более файлов на эту «площадку», с помощью функции
<b>createObjectURL()</b><b><img>,</b>Пример 22.10. Отображение файлов изображений с использованием URL-adpecoe двоичных объектов
<b><!DOCTYPE html></b><b><html><head></b><b><script></b><b>// На момент написания этих строк создатели Firefox и Webkit еще не пришли</b><b>// к соглашению об именовании функции createObjectURL()</b><b>var getBlobURL = (window.URL && URL.createObjectURL.bind(URL)) ||</b><b> (window.webkitURL && webkitURL.createObjectURL.bind(webkitURL)) ||</b><b> window.createObjectURL;</b><b>var revokeBlobURL = (window.URL && URL.revokeObjectURL.bind(URL)) ||</b><b> (window.webkitURL && webkitURL.revokeObjectURL.bind(webkitURL)) ||</b><b> window.revokeObjectURL;</b><b>// После загрузки документа добавить обработчики событий к элементу droptarget,</b><b>// чтобы он мог обрабатывать сбрасываемые файлы</b><b>window.onload = function() {</b><b> // Отыскать элемент, к которому следует добавить обработчики событий,</b><b> var droptarget = document.getElementByld("droptarget");</b><b> // Выделяет элемент droptarget изменением рамки, когда пользователь</b><b> // буксирует файлы над ним.</b><b> droptarget.ondragenter = function(e) {</b><b> // Игнорировать, если буксируется что-то иное, не являющееся файлом.</b><b> // Когда будет реализована поддержка атрибута dropzone, определяемого</b><b> // спецификацией HTML5, это позволит упростить обработчик,</b><b> var types = e.dataTransfer.types;</b><b> if (!types ||</b><b> (types.contains && types.contains("Files")) ||</b><b> (types.indexOf && types.indexOf("Files") != -1)) {</b><b> droptarget.classList.add("active"); // Выделить элемент droptarget</b><b> return false; // Нас интересует</b><b> } // буксируемый объект</b><b> };</b><b> // Снимает выделение площадки сброса, как только пользователь</b><b> // отбуксирует файл за ее пределы</b><b> droptarget.ondragleave = function() {</b><b> droptarget.classList.remove("active");</b><b> };</b><b> // Этот обработчик просто сообщает броузеру продолжать посылать события </b><b> droptarget.ondragover = function(e) { return false; };</b><b> // Когда пользователь сбросит файлы, необходимо получить их URL-адреса</b><b> // и отобразить миниатюры,</b><b> droptarget.ondrop = function(e) {</b><b> var files = e.dataTransfer.files; // Сброшенные файлы</b><b> for(var і = 0; і < files.length; i++) { // Обойти все файлы в цикле</b><b> var type = files[і].type;</b><b> if (type.substrings,6) !== "image/") // Пропустить не являющиеся </b><b> continue; // изображениями</b><b> var img = document.createElement("img"); // Создать элемент <img></b><b> img.src = getBlobURL(files[i]); // URL blob:</b><b> // в <img></b><b> img.onload = function() { // После загрузки изобр.</b><b> this.width = 100; // установить его размеры</b><b> document.body.appendChild(this); // и вставить в документ.</b><b> revokeBlobURL(this.src); // Предотвратить утечки памяти!</b><b> }</b><b> }</b><b> droptarget.classList.remove("active"); //Снять выделение</b><b> return false; // Событие сброса обработано</b><b> }</b><b>};</b><b></script></b>