人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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以上差し上げますが、あまり期待しない程度です。。よろしくおねがいします。

●質問者: amazontannken
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Ajax HTML HTTP JavaScript Microsoft
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● lains_you
●27ポイント

私の環境では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>

◎質問者からの返答

説明を加えると、以下の関数の変数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();

}


2 ● tawazou
●27ポイント

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

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

◎質問者からの返答

だめでした。


3 ● vector
●26ポイント

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

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)とすると値が見れると思います。

◎質問者からの返答

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ