@BalusC: я упоминал об этом в своем ответе и в своем комментарии.

озможно! Читай ниже.

Прежде всего, позвольте мне использовать эту диаграмму, чтобы объяснить, какасинхронная загрузка файлов может быть достигнут:

Сожалею. Я закрыл один из своих доменов, и изображение исчезло. Это было действительно хорошее изображение, хотя. Это было до того, как я узнал, что Stack Overflow позволяет загружать изображения через Imgur.

Как видите, хитрость заключается в том, чтобы HTTP-ответ загружался в скрытый элемент IFRAME вместо самой страницы. (Это делается путем установкиtarget свойство элемента FORM при отправке FORM с помощью JavaScript.)

Это работает. Однако проблема, с которой я сталкиваюсь, заключается в том, что серверный скрипт находится надругой домен, FORM-submit - это междоменный HTTP-запрос. Теперь на серверном сценарии включена функция CORS, которая дает моей веб-странице права на чтение данных ответа HTTP-запросов, сделанных с моей страницы, на этот сценарий - но это работает, только если я получаю HTTP-ответ через Ajax, эрго, JavaScript.

Однако в этом случае ответ направлен на элемент IFRAME. И как только XML-ответ попадает в IFRAME, его URL будет сценарий удаления, напримерhttp://remote-domain.com/script.pl.

К сожалению, CORS не охватывает этот случай (по крайней мере, я так думаю) - я не могу прочитать содержимое IFRAME, так как его URL не совпадает с URL страницы (другой домен). Я получаю эту ошибку:

Небезопасная попытка JavaScript получить доступ к фрейму с URL hxxp: //remote-domain.com/script.pl из фрейма с URL hxxp: //my-domain.com/outer.html. Домены, протоколы и порты должны совпадать.

А поскольку содержимое IFRAME является документом XML, внутри IFRAME нет кода JavaScript, который мог бы использоватьpostMessage или что-то.

Итак, мой вопрос:Как я могу получить содержимое XML от IFRAME?

Как я уже говорил выше, я могу напрямую получать междоменные HTTP-ответы (с включенным CORS), но мне кажется, что я не могу читать междоменные HTTP-ответы, когда они загружаются в IFRAME.

И как будто этот вопрос не является достаточно неразрешимым, позвольте мнеисключить эти решения:

easyXDM и аналогичные методы, которые требуют конечной точки в удаленном домене,

изменение ответа XML (для включения элемента SCRIPT),

серверный прокси - я понимаю, что в моем домене может быть серверный скрипт, который может служить прокси.

Итак, кроме этих двух решений, это может быть сделано?

Это можно сделать!!

Оказывается, можно подделать XHR-запрос (Ajax-запрос), который имитируетmultipart/form-data FORM submit (используется на изображении выше для загрузки файла на сервер).

Хитрость заключается в использованииFormData конструктор - читатьэта статья Mozilla Hacks для дополнительной информации.

Вот как вы это делаете:

// STEP 1
// retrieve a reference to the file
// <input type="file"> elements have a "files" property
var file = input.files[0];

// STEP 2
// create a FormData instance, and append the file to it
var fd = new FormData();
fd.append('file', file);

// STEP 3 
// send the FormData instance with the XHR object
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://remote-domain.com/script.pl', true);
xhr.onreadystatechange = responseHandler;
xhr.send(fd);

Вышеприведенный метод выполняет асинхронную загрузку файлов, что эквивалентно обычной загрузке файлов, описанной на изображении выше и достигаемой путем отправки этой формы:

<form action="http://remote-domain.com/script.pl" 
        enctype="multipart/form-data" method="post">
    <input type="file" name="file">
</form>
Как начальник :)

Ответы на вопрос(4)

Ваш ответ на вопрос