JavaScript. Подробное руководство, 6-е издание, стр. 391

Пример 22.10 демонстрирует два важных приема. Во-первых, он реализует «площадку для сброса», которая обрабатывает события механизма буксировки мышью (drag-and-drop), имеющие отношение к файлам. Во-вторых, когда пользователь сбросит один или более файлов на эту «площадку», с помощью функции

<b>createObjectURL()</b>
для каждого из файлов будет создан URL-адрес и элемент
<b>&lt;img&gt;,</b>
чтобы отобразить миниатюры изображений, на которые ссылаются эти URL-адреса.

Пример 22.10. Отображение файлов изображений с использованием URL-adpecoe двоичных объектов

<b>&lt;!DOCTYPE html&gt;</b>

<b>&lt;html&gt;&lt;head&gt;</b>

<b>&lt;script&gt;</b>

<b>// На момент написания этих строк создатели Firefox и Webkit еще не пришли</b>

<b>// к соглашению об именовании функции createObjectURL()</b>

<b>var getBlobURL = (window.URL &amp;&amp; URL.createObjectURL.bind(URL)) ||</b>

<b>    (window.webkitURL &amp;&amp; webkitURL.createObjectURL.bind(webkitURL)) ||</b>

<b>    window.createObjectURL;</b>

<b>var revokeBlobURL = (window.URL &amp;&amp; URL.revokeObjectURL.bind(URL)) ||</b>

<b>    (window.webkitURL &amp;&amp; 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(&quot;droptarget&quot;);</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 &amp;&amp; types.contains(&quot;Files&quot;)) ||</b>

<b>        (types.indexOf &amp;&amp; types.indexOf(&quot;Files&quot;) != -1)) {</b>

<b>      droptarget.classList.add(&quot;active&quot;); // Выделить элемент droptarget</b>

<b>      return false;                       // Нас интересует</b>

<b>    }                                     // буксируемый объект</b>

<b>  };</b>

<b>  // Снимает выделение площадки сброса, как только пользователь</b>

<b>  // отбуксирует файл за ее пределы</b>

<b>  droptarget.ondragleave = function() {</b>

<b>    droptarget.classList.remove(&quot;active&quot;);</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; і &lt; files.length; i++) { // Обойти все файлы в цикле</b>

<b>      var type = files[і].type;</b>

<b>      if (type.substrings,6) !== &quot;image/&quot;)  // Пропустить не являющиеся </b>

<b>        continue;                           // изображениями</b>

<b>      var img = document.createElement(&quot;img&quot;); // Создать элемент &lt;img&gt;</b>

<b>      img.src = getBlobURL(files[i]); // URL blob:</b>

<b>                                      // в &lt;img&gt;</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(&quot;active&quot;); //Снять выделение</b>

<b>    return false; // Событие сброса обработано</b>

<b>  }</b>

<b>};</b>

<b>&lt;/script&gt;</b>