こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

returnがundefinedになってしまう。

登録フォームhtml(php)からonclickで呼び出すvalidate functionから、ある値の有効性をチェックする別のcheck_data functionを呼び出しています。
check_data functionのソースは以下です。

function check_data(data)
{
var ajaxRequest;
try{
//Opera 8.0+,Firefox,Safari
ajaxRequest = new XMLHttpRequest();
}catch(e){
//Internet Explorer Browsers
try{
ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){
try{
ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
}catch(e){
//something went wrong
alert("your browser broke!");
return false;
}
}
}
//Create a function that will receive date sent from the server
ajaxRequest.onreadystatechange = function(){
if(ajaxRequest.readyState==4){
var ajaxDisplay = document.getElementById('data_msg');
ajaxDisplay.innerHTML = ajaxRequest.responseText;

var val = ajaxRequest.responseText;
return val;

}
}

var date = new Date();
var timestamp=date.getTime();
//var data = document.getElementById('data').value;
data = data;
var queryString = "?tm=" + timestamp + "&data=" + data;

ajaxRequest.open("GET","data_check.php" + queryString, true);
ajaxRequest.send(null);


}

これを validate functionから
var vdata = check_data(data);
alert(vdata);
みたいな感じで呼び出しています。
alertにしているのは単に値が正確に返っているかチェックするためです。
しかし、このvdataに入ってるはずの値がundefinedになってしまうのです。
check_data function内でvar val = ajaxRequest.responseText;
をalert(val)する場合には正確な値がalertされるのですが、
validate functionから呼び出してvar vdata = check_data(data);
する部分で何故かundefinedになってしまうのです。
responseTextでデータが取得される前にreturnされてしまいundefined
になるのかとも思うのですが、たとえばreturn val;の代わりにreturn 10;
などにしてもvalidate functionから呼び出すと、undefinedになってしまいます。
何が問題なんでしょうか?
IE6とFireFox3.03で同様の結果になります。

因みに
function test()
{
var test = 'ok';
return test;
}

をvalidate functionから呼び出した場合は
キチンと'ok'がalertされます。

投稿日時 - 2008-12-23 17:30:52

QNo.4577904

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

回答内容はNo.1と同じですが。

JavaScriptの関数はreturn の命令がない場合は、暗黙的にundefinedを返します。

check_data()の中で、tryして失敗するとcatchを等か繰り返し、
全てに失敗するとreturn falseしていますが、
一度でもtryに成功した場合は、何か返していますか?

投稿日時 - 2008-12-25 18:26:54

補足

コピペのツギハギなので深く理解して使っているわけではないのです。
undefinedが帰るのは、
ajaxRequest.onreadystatechange = function(){
の無名関数内だからと理解したのですが、そのあたりのコードも関係あるのでしょうか?

投稿日時 - 2008-12-28 01:44:29

ANo.2

ここは ちょうどオブジェクト指向の難しい場所にさしかかってるね。
(正しくはイベント処理)

普通の処理であるなら質問文のように
[X]呼び出す情報を生成(今回の場合日付)
[X]check_dataを呼ぶ
[X]その返値を使って処理をする
という形になるけれどこれを

[α]呼び出す情報を生成
[α]check_dataを呼ぶ
[α]αとしては終了

[β]check_dataが終わった時に呼び出される
 ajaxRequest.onreadystatechange の無名関数を通常の関数に置き換える事になるかな
[β]本来「[X]その返値を使って処理」がここにくる


簡単に書くと起動して終わるプロセスとcheck(読み出し)が終わって起動するプロセスが別々に存在して別々に駆動するコード記述が必要になるって事になるね。
感じとしては「onなんたら」のfunctionを書く気分に近いかな。

いつもの「順番に処理」で「読み込み中は待つ」じゃなく
「できたからやるよー」という合図で処理を裁く形に変わっていく。

投稿日時 - 2008-12-24 17:46:50

補足

無名関数やコールバック関数で検索してみましたが、
今の自分の知識では理解が難しいですね。
javascriptのオブジェクト指向について理解を深めて行けばいいのかな?

投稿日時 - 2008-12-28 01:31:52

ANo.1

そりゃそうでしょ だってcheck_data自体が 何もreturnしてないもの。
ajaxRequest.onreadystatechangeの無名functionは確かにreturnしているけれどこれを受け取っているのもないから呼ばれてもこのreturnは破棄されてるだけだし…

でもdata_msgには値が設定されてるんじゃない?これだと。

投稿日時 - 2008-12-23 18:51:52

補足

たしかにdata_msgに値は設定されているのですが、
その値をjavascriptの変数に渡せないので意味がありません。
validate functionで変数をvalideteした後にフォーム変数処理用のphpに送信したいのです。

投稿日時 - 2008-12-23 20:00:42

あなたにオススメの質問