1

説明の最初の部分は、ajax でファイルをアップロードしようとすると、安全でない JavaScript がフレームにアクセスしようとすることです。問題は、ajax-way でファイルをアップロードしようとすると、アクセス拒否エラーが発生することです。

長いデバッグの後、私は猿のクライアントをロードしない場合、すべてが機能していることを発見しました. Ape is comet サーバーhttp://www.ape-project.org/

Ape は src = " http://8.ape.readbox.cz:6969/ ?..." で iframe を作成します。ape を無効にして、この iframe が作成されていない場合、ajax-upload 用に作成された iframe のドキュメントに問題なくアクセスできます。

一緒に彼らはのように見えます

<iframe src="http://8.ape.readbox.cz:6969/?..." style="display: none; position: absolute; left: -300px; top: -300px;" id="ape_undefined"></iframe>
<iframe style="display: none;" id="ValumsAjaxUpload0" src="javascript:false;" name="ValumsAjaxUpload0"></iframe>

お願いします、誰か助けてくれませんか?よくわかりません。

4

2 に答える 2

2

残念ながら、具体的な解決策をお伝えすることはできません。問題の要点は次のとおりです。

APE がクロスドメイン (実際にはサブドメイン) の POST 呼び出しを行うために、ape は document.domain (グローバルなウィンドウ変数) をリセットし、ドメインプレフィックス (www.、beta. など) を取り除く必要があります。 . 0.ape.YOURDOMAIN.com は www.YOURDOMAIN.com からのクロスドメイン制限ですが、YOURDOMAIN.com からは同じドメインの権利が許可されています。残念ながら、アップローダの iframe が親ウィンドウにアクセスするには、同じドメインからのものである必要があります。document.domain をリセットすると、それが変わります。

1 つの解決策は、APE のデフォルトの XHR メソッドを「POST」から「GET」に変更することです。もちろん、外部ドメインから取得リクエストを行うことはできますが、送信できるデータの量は制限されています。さらに、ページの document.domain をリセットする JavaScript の行をコメントアウトする必要があります。

これは、おそらくあなたが探している優れた信頼できる解決策ではありませんが、問題の原因に少し光を当てることを願っています.

于 2010-11-03T21:19:02.427 に答える
0

jQuery Form Pluginと APE comet サーバーを使用していますが、iframe を使用してファイルをアップロードする際に同じ問題が発生しました。これが私の解決策です(動的iframeの代わりに静的iframeを使用):

APE を開始する前に読み込まれる次のコードをページに追加します。

<iframe id="file_upload_iframe" name="file_upload_iframe" src="iframe_src.html" style="position: absolute;left: -300px;top:-300px; width:0px;height:0px;"></iframe>

iframe_src.html ページ (静的 iframe の初期ソース) をサイトに追加します。

<html>
<head>
</head>
<body> 
<script type="text/javascript">
  document.domain = document.domain;  <!-- this is the main line -->
</script>
</body>
</html>

このページの目的は、フォーム プラグインが初期フォームを送信できるようにして、パーミッション エラーを回避することです。
アプリケーションは、次の方法で応答を返す必要があります。

<html>
<head></head>
<body> 
<script type="text/javascript">document.domain = document.domain;</script>
<textarea>' + YOUR_DATA_TO_RETURN + '</textarea>
</body>
</html>

これは、2 回目以降のフォーム送信で許可拒否エラーが発生しないようにするためです。

クライアント側でのフォーム送信のコード:

$('#image_add_commit').click(function(){
    $('#file_upload_iframe').unbind();//may be it is unnecessary
    $('#image_add_form').ajaxSubmit( 
        {success: image_add_complete,
        iframe: true,
        iframeTarget: $('#file_upload_iframe').get(0),
        dataType: 'html',
        textarea: true});
}); 

function image_add_complete(data){
   //data variable contains YOUR_DATA_TO_RETURN that was wrapped in HTML code
}

jquery.form.js ファイルの変更:

ブロックを探す

            if (!s.iframeTarget) {
                // add iframe to doc and submit the form
                $io.appendTo('body');

                if (io.attachEvent)
                    io.attachEvent('onload', cb);
                else
                    io.addEventListener('load', cb, false);
            }

そしてそれをに変更します

        if (!s.iframeTarget) {
            // add iframe to doc and submit the form
            $io.appendTo('body');
        }
            if (io.attachEvent)
                io.attachEvent('onload', cb);
            else
                io.addEventListener('load', cb, false);

(つまり、2 番目の中括弧を上に移動するだけです)

于 2012-04-14T18:51:22.607 に答える