0

filerag.jsによって提供されるコードから始めて、アップロード ファイルの非同期関数を実装しました。

問題は、呼び出しが完了するとテキストを取得できないことです。POSTリクエストが完了するとfirebugコンソールに表示されるため、実際にはテキストが返されると確信しています。問題は、私のコードがそれをページに追加しないことです。

コードは次のとおりです。

if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
} else {// code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}

function showHint(str,action,target,url) {
    xmlhttp.open("POST",url,true);
    xmlhttp.setRequestHeader("enctype","multipart/form-data");
    var fd = new FormData;
    fd.append('filexls', str);
    xmlhttp.send(fd);

   console.log(xmlhttp.status); 
      if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            $('#successup').html(xmlhttp.responseText);
      }
}

私はいくつかのテストを行いましたが、問題はコードの最後の部分にあると思います。ステートメントのconsole.log(xmlhttp.status)前に配置すると、返されます(リクエストの最後にある firebug が返されます) が、中に配置すると、コンソールには何も表示されません。したがって、問題は、実際のリクエストが実行される前にステートメントが実行され、返されることです。if0200ififfalse

4

1 に答える 1

1

にイベント リスナーを割り当てる必要がありますxmlhttp.onreadystatechange

リスナー内で、新しい readyState を で確認できますxmlhttp.readyState。readyState4は完了を意味します。その後、次のプロパティにアクセスできます: xmlhttp.statusxmlhttp.responseText. xmlhttp.getAllResponseHeaders()を使用するか、次のような方法でヘッダーにアクセスすることもできますxmlhttp.getResponseHeader("Content-Type")

リクエストのステータスが Falsy の場合 ( で確認if(!xmlhttp.status))、リクエストは失敗しています。それ以外の場合、ステータスは応答の HTTP ステータス コードです。

あなたがすることができます:

xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState==4 && xmlhttp.status==200) {
                $('#successup').html(xmlhttp.responseText);
    }
}

注: 同期 xmlhttprequests を使用することもできますが、これらは完了する前に UI 全体をブロックするため、Web ワーカー内で実行する場合を除き、実用的ではありません。MDN のドキュメントを参照してください。

また、http://blogs.msdn.com/b/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspxによると、 を使用することをお勧めしますnew ActiveXObject("Msxml2.XMLHTTP")Microsoft.XMLHTTP識別子は非推奨です。この記事は2006年のものです。

「Microsoft」名前空間は実際には古く、従来のサポートのために MSXML3 でのみ実装されています。古いバージョンで「より良い」名前を使用したのは残念ですが、オブジェクトをインスタンス化するときは「msxml2」名前空間に固執します。

于 2013-05-14T10:42:17.453 に答える