Анализ xml/json-ответа в IE9

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

Я хочу использовать службу обмена фотографиями API imgur через кросс-домен XHR, и, судя по всему, он отлично работает. Я начинаю запрос, они отправляют xml, и все, что мне нужно, это обрабатывать. Однако я не могу сделать это правильно в Internet Explorer 9, несмотря на множество предложений (работает в Chrome, Firefox). Это самый простой код, который я пробовал:

HTML:

<form id="uploadForm" action="http://api.imgur.com/2/upload.xml" method="POST" enctype="multipart/form-data">
 
 File: 
 Return Type: <select id="uploadResponseType" name="mimetype">
 <option value="xml">xml</option>
 </select>
 
 </form>

Там вы можете увидеть ключ к API Imgur (вы можете использовать его, если хотите... это только для целей тестирования, но я не знаю, что что-то не так с ответом xml, который я получаю).

Я использую JQuery Form Plugin для управления загрузкой файлов.

XML:

Это самый простой фрагмент кода, который я тестировал. Обычно нам нужно помочь Internet Explorer самостоятельно анализировать XML, поэтому у меня есть parseXml.

JavaScript:

function parseXml(xml) { 
 if (jQuery.browser.msie) { 
 var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); 
 xmlDoc.loadXML(xml); 
 xml = xmlDoc; 
 } 
 return xml; 
} 
$('#uploadForm').ajaxForm({
 dataType: ($.browser.msie) ? "text" : "xml",
 accepts: {
 xml: "text/xml",
 text: "text/xml"
 },
 // has been received
 success: function(data) {
 $('#uploadOutput').html('Submitting...');
 data = parseXml(data);
 console.log(data);
 alert(data);
 },
 complete: function(data) {
 $('#uploadOutput').html('Complete...');
 }
});

dataType: ($.browser.msie) ? "text" : "xml" предположительно сообщает IE о возврате текстового ответа. Несмотря на все эти заверения, Content Type ответа application/xml (мне сказали, что это не проблема). В качестве xml я получаю следующее:

<!--?xml version="1.0" encoding="utf-8"?-->
<upload><name><title><caption/><hash>087Y0</hash><deletehash>gUcgywjXoJyAJp6</deletehash><datetime>2012-06-02 21:59:35</datetime><type>image/jpeg</type><animated>false</animated><width>1024</width><height>768</height><size>297623</size><views>0</views><bandwidth>0</bandwidth></image><links><original>http://i.imgur.com/087Y0.jpg</original><imgur_page>http://imgur.com/087Y0</imgur_page><delete_page>http://imgur.com/delete/gUcgywjXoJyAJp6</delete_page><small_square>http://i.imgur.com/087Y0s.jpg</small_square><large_thumbnail>http://i.imgur.com/087Y0l.jpg</large_thumbnail></links></upload>
</code>

Я думаю, что это выглядит нормально, и я могу разобрать его в других браузерах, используя что-то вроде $($.parseXml(xml)).find('original').text(), но не в IE9. Так что в основном, я получаю ответ, но я не могу разобрать этот xml, хотя, когда я пытаюсь понять, что я получаю в IE, похоже, что я ничего не получаю.

Кроме того, success даже не срабатывает, что является сигналом, что IE9 не может разобрать xml. complete срабатывает, но ничего не получает как data. Так что я делаю неправильно?

Здесь вы можете получить fiddle (включая плагин JQuery Form).

UPDATE:

JSON


Для справок в будущем JSON не будет работать с использованием JQuery Form Plugin в этой ситуации. Из документации:

<code>The iframe element is used as the target of the form submit operation 
which means that the server response is written to the iframe. This is fine 
if the response type is HTML or XML, but doesn't work as well if the response 
type is script or JSON, both of which often contain characters that need to 
be repesented using entity references when found in HTML markup. To account 
for the challenges of script and JSON responses when using the iframe mode, 
the Form Plugin allows these responses to be embedded in a textarea element 
and it is recommended that you do so for these response types when used in 
conjuction with file uploads and older browsers.
</code>

Идеи?.

Спасибо!

1 ответ

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

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

Попробуйте включить режим отладки плагина с помощью $.fn.ajaxSubmit.debug = true;, и вы увидите, что происходит за кулисами.

К сожалению, единственный способ сделать загрузку - использовать скрытый iframe в вашем HTML, не добавленный script, и принудительно отправить сообщение ему, передав параметр iframeTarget с помощью селектора для этого iframe, но вы не будете быть в состоянии захватить ответ из-за вышеупомянутой проблемы (я не знаю, почему iframe, сгенерированный плагином, не публикует данные):

JS:

$('#uploadForm').ajaxForm({
 iframeTarget: ($.browser.msie) ? "#iframeTarget" : false,
 ...

HTML:

<iframe name="iframeTarget" id="iframeTarget">This iframe can be hidden with CSS</iframe>

Вы также можете использовать условные комментарии, чтобы скрыть iframe из других браузеров:

Обратите внимание на то, что обратный вызов success не срабатывает. Забастовкa >

Edit:

На этом сайте вы связываетесь с опцией ответа JSON?

Если это возможно, вы можете использовать jsonp в качестве параметра dataType, добавить ?callback=someFunction в конец URL-адреса и записать someFunction(data){}, который получает данные и анализирует их так же, как ваш success Обратный вызов.

licensed under cc by-sa 3.0 with attribution.