1

この問題は解決したと思っていましたが、今回は別の問題のようですが、残念ながら解決していません。

クロスドメイン XHR を介して imgur API 写真共有サービスを使用したいのですが、どうやら正常に動作しているようです。リクエストを開始すると、xml が送信され、それを処理するだけで済みます。ただし、複数の提案にもかかわらず、Internet Explorer 9 では正しく実行できません (Chrome、Firefox で動作します)。これは私が試した最も単純なコードです:

HTML:

<!DOCTYPE html>
  <html>
    <body>
    <form id="uploadForm" action="http://api.imgur.com/2/upload.xml" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="key" value="00ced2f13cf6435ae8faec5d498cbbfe"/>
    File: <input type="file" name="image"/>
    Return Type: <select id="uploadResponseType" name="mimetype">
    <option value="xml">xml</option>
    </select>
    <input type="submit" value="Submit 1" name="uploadSubmitter1"/>
    </form>
    <div id="uploadOutput"></div>
    </body>
  </html>

そこでは、Imgur API のキーを確認できます (必要に応じて使用できます... これはテスト目的のみですが、受信した 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><image><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>

見た目は問題ないと思います$($.parseXml(xml)).find('original').text()が、IE9ではできませんが、のようなものを使用して他のブラウザで解析できます。基本的に、応答を受信して​​いますが、その xml を解析できませんが、IE で何が得られているかを理解しようとすると、何も得られないように見えます。

さらに、successIE9 が xml を解析できなかったことを示す信号である発火さえしていません。completeは発砲していますが、何も受信しませんdata。それで、私は何を間違っていますか?

ここでは、フィドルを使用できます(Jquery Form Plugin を含む)。

アップデート:

JSON


今後の参考として、JSON はこの状況で Jquery Form Plugin を使用すると機能しません。ドキュメントから:

The iframe element is used as the target of the form's 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.

アイデア?.

ありがとう!

4

1 に答える 1

0

これは、Same Origin ポリシーと呼ばれるクロスドメイン セキュリティによるものです。

このプラグインは、ブラウザによって実装されている場合 (Chrome など) に File API を使用し、実装されていない場合は、非表示の iframe を作成してそこにデータを投稿する巧妙なトリックを使用します。アドレスが別のドメインにある場合、プラグインは iframe からデータを取得できないため、失敗します。

次を使用してプラグインのデバッグ モードを有効にしてみてください$.fn.ajaxSubmit.debug = true;。舞台裏で何が起こっているかがわかります。

残念ながら、アップロードを行う唯一の方法は、スクリプトで追加するのではなく、HTML で非表示の iframe を使用し、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 を非表示にすることもできます。

<!--[if IE]>
<iframe name="iframeTarget" id="iframeTarget">This iframe can be hidden with CSS</iframe>
<![endif]-->

これに関する注意点は、successコールバックが起動しないことです。

編集:

JSONこのサイトは応答オプションと通信していますか?

ある場合は、パラメーターjsonpとして使用し、URL の末尾に追加して、データを受信し、コールバックと同じ方法で解析する を記述します。dataType?callback=someFunctionsomeFunction(data){}success

于 2012-06-03T03:42:14.733 に答える