下記のコードを実行すると、
'undefined'
'hello'
と表示されます。
(A)の箇所でグローバル変数gTestに'hello'が格納されている事を期待するのですが、undefinedとなります。
どういった理由でこうなるのでしょうか?
また、onCompleteで定義した処理内で、
値をグローバル変数に格納するにはどのような方法がありますか?
何卒よろしくお願い致します。
--
<script src="/js/prototype.js" type="text/javascript"></script>
<script type="text/javascript">
var gTest;
function load()
{
new Ajax.Request('http://~/', { method: 'get', onComplete: displayData });
alert(gTest);//(A)undefinedと表示
}
function displayData(httpObj)
{
gTest = 'hello';
alert(gTest);//(B)helloと表示
}
load();
</script>
--
No.2ベストアンサー
- 回答日時:
#1さんのおっしゃる通りです。
Requestの通信モードのデフォルトは非同期通信です。
よって、Requestの結果を待たずに次のステップに移るので
最初はundefinedになります。
もし、Requestの結果を待ってから次のステップに移るように動作させたいのであればRequestのパラメータにasynchronousを加えて同期通信にする必要があります。
new Ajax.Request('http://~/', { asynchronous : false , method: 'get', onComplete: displayData });
こうすると、コールバック関数(B)が先に実行され、次のステップ(A)に移ります。
返答ありがとうございます。
大変良く分かりました。
とても当たり前の動作をしていただけなのですね。
もっと明確に「非同期通信」を意識しなくてはダメでしたね。
No.3
- 回答日時:
非同期っぽいサンプル。
<script type="text/javascript">
var gTest;
function load()
{
setTimeout(displayData, 5000);
alert(gTest); //(A)undefinedと表示
}
function displayData(httpObj)
{
gTest = 'hello';
alert(gTest); //(B)helloと表示
}
load();
</script>
No.1
- 回答日時:
alert(gTest); //(A)undefinedと表示
が先に実行され、 このときは、gTest はまだ
undefined
です。
new Ajax.Request('http://~/', { method: 'get', onComplete: displayData });
が完了するときに、
displayData ()の
alert(gTest); //(B)helloと表示
が実行されるのだと思います。
gTestに異なる初期値を与えて実験しても面白いとでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- JavaScript JAVASCRIPT 2 2022/04/15 15:10
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript プラグイン無しでContactform7にdatepickerを実装 3 2022/10/25 02:18
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSPの処理の途中で、JavaScript...
-
デザイン時のVisible=Falseは実...
-
初心者です。gulpでコンパイル...
-
リクエスト結果が一瞬しか表示...
-
resizeToメソッドが動作しません
-
1つのVBAコードをすべてのコア...
-
if(1){...}とはどういうことで...
-
既存のwebサイトで、ローカルの...
-
C#でボタン名を変更しても動く
-
Ajaxがおかしいんです
-
エクセル VBA タイマー動作 の...
-
CreateFile、CloseHandleの繰り...
-
シャットダウンスクリプトの記述
-
VB.netでタイマーがスタートし...
-
CTRL + Xを無効にしたい
-
ActiveXObject("Msxml2.XMLHTTP...
-
ステップ実行ででは出ないエラ...
-
jQuery ui Datepicker 明日以降...
-
alert()が実行できない
-
ACCESS(VBA)の検索結果判定に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
if(1){...}とはどういうことで...
-
JSPの処理の途中で、JavaScript...
-
デザイン時のVisible=Falseは実...
-
1つのVBAコードをすべてのコア...
-
〔Excel:VBA〕マクロの実行が異...
-
以下のコードを実行しても、オ...
-
PowerPointで時計表示
-
C#でボタン名を変更しても動く
-
jQuery ui Datepicker 明日以降...
-
初心者です。gulpでコンパイル...
-
リクエスト結果が一瞬しか表示...
-
innerHTMLなどの反映タイミング
-
既存のwebサイトで、ローカルの...
-
JavaScriptで、実行するたび値...
-
VBA ステータスバー DoEvents
-
VBA SORT Applyでエラー
-
Excel VBA にて JavaScript の...
-
resizeToメソッドが動作しません
-
eval()の危険性の具体例を教え...
-
ラベルの色がかわってくれない
おすすめ情報