ajaxで別ファイルをopenし、responseTextの内容を関数の外で仕様したいのですが、それには方法が2つあると考えました。


①グローバル変数を使用する → ×(他の関数でtextを調べましたが何も入ってませんでした。)

var text;//グローバル変数

function transaction(){
//通信ライブラリの実装がブラウザーによって違う
xmlhttp = this.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
//サーバーからレスポンスがあったときの関数。読み込んだらHTMLを操作する
xmlhttp.onreadystatechange = function(){
if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
text = xmlhttp.responseText;
//通常はdocument.getElementById("item").innerHTML = text;などとやって、<div id="item"></div>に表示
}
}
//HTTPリクエストの発行
xmlhttp.open('GET','Sample011',true);
xmlhttp.send(null);
}

②関数の戻り値を利用する → ×(戻り値はundefined)
function transaction(){
var text;
~~省略
return text;
}
両方ともだめでした。当方JavaScriptは初心者でajaxも少しさわった程度です。有力な回答には100pt以上差し上げますが、あまり期待しない程度です。。よろしくおねがいします。

回答の条件
  • 1人5回まで
  • 登録:2006/05/30 17:15:20
  • 終了:2006/06/01 16:03:38

回答(3件)

id:lains_you No.1

lains_you回答回数50ベストアンサー獲得回数102006/05/30 18:05:16

ポイント27pt

私の環境では1で動作いたしました

以下の点を確認してみてください。


・Sample011というファイルが存在しているか

・transaction関数を呼び出しているか

・サーバで実行しているか

(FirefoxおよびIE6ではローカルで動作しません)


以下、私が試したソース

<html>

<head>

<script type="text/javascript">

var text;//グローバル変数

function transaction(){

//通信ライブラリの実装がブラウザーによって違う

xmlhttp = this.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

//サーバーからレスポンスがあったときの関数。読み込んだらHTMLを操作する

xmlhttp.onreadystatechange = function(){

if (xmlhttp.readyState == 4 && xmlhttp.status == 200){

text = xmlhttp.responseText;

//通常はdocument.getElementById("item").innerHTML = text;などとやって、<div id="item"></div>に表示

}

}

//HTTPリクエストの発行

xmlhttp.open('GET','sample011',true);

xmlhttp.send(null);

}

</script>

</head>

<body onload="transaction();">

<button onclick="alert(text);">b</button>

</body>

</html>

id:amazontannken

説明を加えると、以下の関数の変数textのデータをajaxを使って別ファイルからもってこようと思っています。

lains_youさんのサンプルは当環境でもちゃんと動きました。

ですが、transaction()をbody onloadで読み、mmLoadMenus()

をイベントハンドラで読んでも動きません。o0

function mmLoadMenus() {//dreamweaverのポップアップメニュー

if (window.mm_menu_0530160415_0) return;

window.mm_menu_0530160415_0 = new Menu("root",76,18,"",12,"#000000","#000000","#FFFFFF","#3165CE","left","middle",3,0,1000,-5,7,true,true,true,0,true,true);

mm_menu_0530160415_0.addMenuItem("あああ");

mm_menu_0530160415_0.addMenuItem(text);

mm_menu_0530160415_0.hideOnMouseOut=true;

mm_menu_0530160415_0.bgColor='#FFFFFF';

mm_menu_0530160415_0.menuBorder=1;

mm_menu_0530160415_0.menuLiteBgColor='#FFFFFF';

mm_menu_0530160415_0.menuBorderBgColor='#000000';

mm_menu_0530160415_0.writeMenus();

}

2006/05/30 19:35:37
id:tawazou No.2

tawazou回答回数33ベストアンサー獲得回数72006/05/30 18:16:24

ポイント27pt

非同期で実行してみたらどうでしょうか?

xmlhttp.open('GET','Sample011',false);

id:amazontannken

だめでした。

2006/05/30 19:38:35
id:vector_xenon No.3

vector回答回数113ベストアンサー獲得回数42006/05/30 18:18:08

ポイント26pt

基本的には①で大丈夫です。

onreadystatechangeが実行されreadyState == 4 && status == 200のときに変数textの中に値が渡されます。


ですが、値を確かめたのが非同期通信によって値が返ってきたとき以降ではないと空のままですので、確かめたときは「まだ値が返ってきていない」状態だったわけです。


ですので実質その値を利用するには

xmlhttp.onreadystatechange = function(){

  if (xmlhttp.readyState == 4 && xmlhttp.status == 200){

  }

の中で処理しないといけなくなります。

(いつ値が返ってくるか判断できないため)


ですので、外でresponseTextの値を利用するのであれば、別の関数に引数として渡して利用します。




グローバル変数にも値は渡っているので、ボタンをひとつ作成し、transaction()が開始されたらそのボタンをdisable=trueにして押せないようにし、if (xmlhttp.readState .........)の中を通ったらボタンをdisable=falseにし、ボタンのonclickイベントでalert(text)とすると値が見れると思います。

id:amazontannken

仕事が休みでしたので間を空けてしまい申し訳ございませんでした。

すべての回答者の回答が参考になりましたが、いろいろ試してみると根本的な問題に気付いて他の方法でせざるをえないことになりました。

回答してくれた方々どうもありがとうございました。

2006/06/01 14:52:52

コメントはまだありません

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

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

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

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