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

<b>    var url = target.getAttribute(&quot;data-uploadto&quot;);</b>

<b>    if (!url) continue;</b>

<b>    createFileUploadDropTarget(target, url);</b>

<b>  }</b>

<b>  function createFileUploadDropTarget(target, url) {</b>

<b>    // Следит за ходом выполнения операции выгрузки и позволяет отвергнуть </b>

<b>    // выгрузку файла. Можно было бы обрабатывать сразу несколько параллельных </b>

<b>    // операций выгрузки, но это значительно усложнило бы </b>

<b>    // отображение хода их выполнения,</b>

<b>    var uploading = false;</b>

<b>    console.log(target.url);</b>

<b>    target.ondragenter = function(e) {</b>

<b>      console. log(&quot;dragenter&quot;);</b>

<b>      if (uploading) return; // Игнорировать попытку сброса, если</b>

<b>      // элемент уже занят выгрузкой файла</b>

<b>      var types = e.dataTransfer.types;</b>

<b>      if (types &amp;&amp;</b>

<b>          ((types.contains &amp;&amp; types.contains(&quot;Files&quot;)) ||</b>

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

<b>        target.classList.add(&quot;wantdrop&quot;);</b>

<b>        return false;</b>

<b>      }</b>

<b>    };</b>

<b>    target.ondragover = function(e) {</b>

<b>      if (!uploading) return false;</b>

<b>    };</b>

<b>    target.ondragleave = function(e) {</b>

<b>      if (!uploading) target.classList.remove(&quot;wantdrop&quot;);</b>

<b>    };</b>

<b>    target.ondrop = function(e) {</b>

<b>      if (uploading) return false;</b>

<b>      var files = e.dataTransfer.files;</b>

<b>      if (files &amp;&amp; files.length) {</b>

<b>        uploading = true;</b>

<b>        var message = &quot;Выгружаются файлы:&lt;ul&gt;&quot;;</b>

<b>        for(var і = 0; і &lt; files.length; i++)</b>

<b>          message += &quot;&lt;li&gt;&quot; + files[i].name + &quot;&lt;/li&gt;&quot;;</b>

<b>        message += &quot;&lt;/ul&gt;&quot;;</b>

<b>        target.innerHTML = message;</b>

<b>        target.classList.remove(&quot;wantdrop&quot;);</b>

<b>        target.classList.add(&quot;uploading&quot;);</b>

<b>        var xhr = new XMLHttpRequest();</b>

<b>        xhr.open(&quot;POST&quot;, url);</b>

<b>        var body = new FormData();</b>

<b>        for(var i=0; і &lt; files.length; i++)</b>

<b>          body.append(i, files[і]);</b>

<b>        xhr.upload.onprogress = function(e) {</b>

<b>        if (e.lengthComputable) {</b>

<b>            target.innerHTML = message +</b>

<b>            Math.round(e.loaded/e.total*100) +</b>

<b>                             &quot;% Завершено&quot;;</b>

<b>          }</b>

<b>        };</b>

<b>        xhr.upload.onload = function(e) {</b>

<b>          uploading = false;</b>

<b>          target.classList.remove(&quot;uploading&quot;);</b>

<b>          target.innerHTML = &quot;Отбуксируйте сюда файл для выгрузки&quot;;</b>

<b>        };</b>

<b>        xhr.send(body);</b>

<b>        return false;</b>

<b>      }</b>

<b>      target.classList. removefwantdrop&quot;);</b>

<b>    }</b>

<b>  }</b>

<b>});</b>

18.1.5. Прерывание запросов и предельное время ожидания

Выполнение HTTP-запроса можно прерывать вызовом метода

<b>abort()</b>
объекта
<b>XMLHttpRequest</b>
. Метод
<b>abort()</b>
доступен во всех версиях объекта
<b>XMLHttpRequest</b>
, и согласно спецификации «XHR2» вызов метода
<b>abort()</b>
генерирует событие «abort». (На момент написания этих строк некоторые броузеры уже поддерживали событие «abort». Наличие этой поддержки можно определить по присутствию свойства
<b>onabort</b>
в объекте
<b>XMLHttpRequest</b>
.)