Получение ответа с удаленного сервера после загрузки файла в iframe - PullRequest
6 голосов
/ 25 ноября 2010

У меня есть форма, которая загружает файл в виде файла на удаленный сервер.В результате на URL-адресе отправки сервер возвращает данные json с результатом операции, который ловит мой iframe.

{'result': 'true' or 'false'}

Теперь я хотел бы получить этот json в качестве обратного вызова моего iframe.Я знаю, что мне нужен jsonp для достижения этой цели, поскольку это межсайтовый вызов.Вот моя функция с примером кода с сайта IBM :

function fileUploadFunction(){     
    var fileUploadForm = $('#file_upload_form');
    fileUploadForm.attr('action', uploadURL);
    fileUploadForm.submit();
    $('#upload_target').load(function () {
        alert("IFrame loaded");
            $.getJSON(uploadUrl+"&callback=?", function(data) {
                alert("Symbol: " + data.symbol + ", Price: " + data.price);
            });
    });         
};

Но здесь возникает несколько проблем.Во-первых, мой uploadUrl просто "http://something/". Нужно ли мне поддерживать вызовы с суффиксом $callback=?
Во-вторых, сервер дает ответ только в результате загрузки файла. Поэтому мне нужно получить сохраненный результатв моем iframe, а не по указанному URL. Как решить эту проблему?

Вот ссылка. Обратите внимание на скрытый iframe внутри формы. Результат с сервера показывает там:

http://ntt.vipserv.org/artifact/


РЕДАКТИРОВАТЬ

Я уже пробовал:

    $('#upload_target').load(function () {
        var ret = frames['upload_target'].document.getElementsByTagName("body")[0].innerHTML;
        var data = eval("("+ret+")");
    });

Но возникает ошибка «Отказано в доступе».

Ответы [ 5 ]

4 голосов
/ 28 ноября 2010

Это легко сделать с помощью easyXDM , и на самом деле есть запись в блоге об этом конкретном случае использования здесь .

По сути, это использование перекрестногообмен сообщениями в домене для передачи ответа на вызывающий документ.

Обновление: Вот ссылка для этого в действии, источник можно найти по адресу github, файлы имеют префикс «upload _».

1 голос
/ 08 марта 2012

Рекомендация Шона easyXDM - отличный вариант (и, вероятно, его следует пометить как правильный), но я хотел предложить другое легкое решение, которое никто не использовал.

В тех случаях, когда вы отправляете сообщение в скрытый iframe в другом домене и просто нуждаетесь в обратном ответе (а не в двухсторонней связи), вы можете передать сообщение из iframe родителю с помощью перенаправленного URL . Вот пример:

  1. родитель загружает iframe в другой домен

  2. родительские опросы myframe.contentWindow.location.href (постоянно появляются Permission denied ошибки, поскольку фрейм находится в другом домене)

  3. iframe обрабатывает, затем перенаправляет на

    http://parentdomain.com/pagethatdoesnotexist?{'result':'ok'}
    
  4. iframe получает 404, но теперь местоположение доступно для родителя

  5. родитель читает сообщение с URL-адреса iframe
0 голосов
/ 08 мая 2014

вообще не использовать .html ().

Я использовал

jQuery('.someElement')

и у меня это сработало. Вы можете сохранить результат в переменной и вставить его в новый элемент

1008 * например *

var = jQuery('.someElement');
jQuery('.newElement').html(var);
0 голосов
/ 27 ноября 2010

Мне кажется, что ваш код будет запрашивать uploadURL дважды: сначала .submit() делает запрос POST для загрузки файла, и результат отображается в iframe как веб-страница;во-вторых, .getJSON() выполняет запрос GET, и результат выполняется как javascript в <script>.Вы поймете это, если откроете Firebug во время тестирования своего приложения.

Поскольку два запроса независимы, я не знаю, как .getJSON() даст вам какую-либо информацию о файле, который вы только что загрузили с .submit().

Для такого рода междоменных соединений я бы предложил использовать postMessage;в противном случае вам нужно будет изменить рабочий процесс приложения, чтобы сделать все в iframe после загрузки файла;например, введите <script>alert('Submission accepted');</script> в iframe.

Что вы пытаетесь сделать после того, как пользователь успешно загрузил файл?

0 голосов
/ 25 ноября 2010

Одним из возможных решений может быть установка имени iframe с чистым js. Это имя может быть прочитано с родительской страницы переноса.

...