JavaScript. Подробное руководство, 6-е издание, стр. 285
<b> var url = target.getAttribute("data-uploadto");</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("dragenter");</b><b> if (uploading) return; // Игнорировать попытку сброса, если</b><b> // элемент уже занят выгрузкой файла</b><b> var types = e.dataTransfer.types;</b><b> if (types &&</b><b> ((types.contains && types.contains("Files")) ||</b><b> (types.indexOf && types.index0f("Files”) !== -1))) {</b><b> target.classList.add("wantdrop");</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("wantdrop");</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 && files.length) {</b><b> uploading = true;</b><b> var message = "Выгружаются файлы:<ul>";</b><b> for(var і = 0; і < files.length; i++)</b><b> message += "<li>" + files[i].name + "</li>";</b><b> message += "</ul>";</b><b> target.innerHTML = message;</b><b> target.classList.remove("wantdrop");</b><b> target.classList.add("uploading");</b><b> var xhr = new XMLHttpRequest();</b><b> xhr.open("POST", url);</b><b> var body = new FormData();</b><b> for(var i=0; і < 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> "% Завершено";</b><b> }</b><b> };</b><b> xhr.upload.onload = function(e) {</b><b> uploading = false;</b><b> target.classList.remove("uploading");</b><b> target.innerHTML = "Отбуксируйте сюда файл для выгрузки";</b><b> };</b><b> xhr.send(body);</b><b> return false;</b><b> }</b><b> target.classList. removefwantdrop");</b><b> }</b><b> }</b><b>});</b>18.1.5. Прерывание запросов и предельное время ожидания
Выполнение HTTP-запроса можно прерывать вызовом метода
<b>abort()</b><b>XMLHttpRequest</b><b>abort()</b><b>XMLHttpRequest</b><b>abort()</b><b>onabort</b><b>XMLHttpRequest</b>