以下のソースでxmlhttpを非同期で使用したい場合はどうしたら

いいのですか?

var HOGEHOGE ={
gettest1:function gettest1(){
if (window.XMLHttpRequest) {
return new XMLHttpRequest()
}else if (window.ActiveXObject) {
try {
return new ActiveXObject("Msxml2.XMLHTTP")
} catch(e) {
return new ActiveXObject("Microsoft.XMLHTTP")
}
}else{
return null
}
},
test2:function test2(){
var xmlhttp = HOGEHOGE.gettest1();
xmlhttp.open('POST','test.txt',false);
xmlhttp.send('');
if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
return true;
}else{
return false;
}
},
test3:function test3(){
if(HOGEHOGE.test2()){
window.alert("aa")
}else{
window.alert("bb")
}
}
}
window.onload =function(){test3()}

回答の条件
  • 1人5回まで
  • 登録:2007/05/28 18:44:04
  • 終了:2007/05/29 19:48:40

回答(1件)

id:mj99 No.1

mj99回答回数138ベストアンサー獲得回数382007/05/28 21:19:06

ポイント60pt
<script>
var HOGEHOGE = {
  test1:function test1() {
    if (window.XMLHttpRequest) {
      return new XMLHttpRequest();
    } else if (window.ActiveXObject) {
      try {
        return new ActiveXObject("Msxml2.XMLHTTP");
      } catch(e) {
        return new ActiveXObject("Microsoft.XMLHTTP");
      }
    } else {
      return null;
    }
  },
  test2:function test2() {
    if (xmlhttp.readyState != 4) { /* 完了までは特になにもしない */
      return ;
    }
    if (xmlhttp.status == 200) {
      window.alert(xmlhttp.responseText);
    } else {
      window.alert(xmlhttp.status);
    }
  },
  test3:function test3() {
    xmlhttp = test1();
    xmlhttp.onreadystatechange = test2; /* 通信イベントの通知を受け取る関数 */
    xmlhttp.open("POST","http://q.hatena.ne.jp/list",true);
    xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xmlhttp.send("word=a&amp;mode=rss");
  },
  xmlhttp:function xmlhttp(){ }
}
window.onload =function() { HOGEHOGE.test3(); };
</script>
<body>
</body>


xmlhttpに通信イベントを受け取る関数を設定しておいて、openの第3引数をtrueとすれば良いです。


----

HOGEHOGEの最後に、xmlhttp:function xmlhttp(){} と定義してあるのは、test1の結果を格納しておくためのダミー関数です。

HOGEHOGEの中にいれずに素直にグローバルで、var xmlhttp=HOGEHOGE.test1()と、定義しておくほう普通かも。


あと、POSTのときパラメータを飛ばすにはsetRequestHeaderが必要です。

id:hopefully

firefoxで行うとxmlhttp.readyStateが

1になってreturnされるのですが、これは

問題ないのでしょうか?

2007/05/29 09:58:35
  • id:mj99
    >firefoxで行うとxmlhttp.readyStateが
    >1になってreturnされるのですが、これは
    >問題ないのでしょうか?

    firefoxでは試してないのですが、たぶんIEと同じで、
    xmlhttp.readyStateが変化するたびにtest2はコールされます。
    通信処理が成功でも失敗でも、最終的にはxmlhttp.readyState=4でtest2がコールされるます。

    http://ponpon-village.net/ajax/xmlhttp.htm#readyState

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません