• 締切済み

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されます。

みんなの回答

回答No.3

回答内容はNo.1と同じですが。 JavaScriptの関数はreturn の命令がない場合は、暗黙的にundefinedを返します。 check_data()の中で、tryして失敗するとcatchを等か繰り返し、 全てに失敗するとreturn falseしていますが、 一度でもtryに成功した場合は、何か返していますか?

methinks
質問者

補足

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

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.2

ここは ちょうどオブジェクト指向の難しい場所にさしかかってるね。 (正しくはイベント処理) 普通の処理であるなら質問文のように [X]呼び出す情報を生成(今回の場合日付) [X]check_dataを呼ぶ [X]その返値を使って処理をする という形になるけれどこれを [α]呼び出す情報を生成 [α]check_dataを呼ぶ [α]αとしては終了 [β]check_dataが終わった時に呼び出される  ajaxRequest.onreadystatechange の無名関数を通常の関数に置き換える事になるかな [β]本来「[X]その返値を使って処理」がここにくる 簡単に書くと起動して終わるプロセスとcheck(読み出し)が終わって起動するプロセスが別々に存在して別々に駆動するコード記述が必要になるって事になるね。 感じとしては「onなんたら」のfunctionを書く気分に近いかな。 いつもの「順番に処理」で「読み込み中は待つ」じゃなく 「できたからやるよー」という合図で処理を裁く形に変わっていく。

methinks
質問者

補足

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

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

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

methinks
質問者

補足

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

関連するQ&A

専門家に質問してみよう