• 締切済み

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

  • Ajax は NN でも使えますか?

    初歩的な質問ですみません。 Ajax の非同期通信で、XMLHTTP オブジェクトを作成するスクリプトを見ると、 function createXMLHttpRequest() { var XMLhttpObject = null; try{ XMLhttpObject = new XMLHttpRequest(); }catch(e){ try{ XMLhttpObject = new ActiveXObject("Msxml2.XMLHTTP"); }catch(e){ try{ XMLhttpObject = new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){ return null; } } } return XMLhttpObject; } のように Microsoft のオブジェクトを読み込んでいるように見えるのですが、NN でもつかえるのでしょうか。 また、Macintosh との互換性はどうなのでしょうか。 ご存知の方はお教えください。

  • returnするには?

    下記のようなソースなのですがarray_walk_recursiveを使用しつつ値を returnするにはどうすればいいでしょうか? 可能であれば仕様上あまり構造変更なくできる方法がいいのですが・・・ class Test { public function hoge($arr){ if (is_array($arr)) { //↓をreturnすると1が返る array_walk_recursive($arr['types'], array($this, 'fuga')); } } function fuga($val){ //echo $val;とすると意図する値が渡っています switch($val) { case 'str': return $this->str();//ここの値が返らない } }

    • 締切済み
    • PHP
  • DBで新規追加したデータがAjaxで反映されない

    いつもお世話になっております。 Apach・PHP・MySQLの構成でWEBアプリを作成しております。 データ表示画面でセレクトボックスを二つ設置して、 一つ目のセレクトボックスを選択した時、OnChangeイベントで Ajaxを利用し選択されたデータのキーに紐づくデータを取得して 二つ目のセレクトボックスに表示するといった処理を作りたいと考えています。 実際にプログラムを組み実装できたのですが、二つ目のセレクトボックスに表示する データを新規登録で追加して、再度一つ目のセレクトボックスを選択して データ表示をおこなっても、追加したはずのデータが表示されません。 ページロードや別画面から再度遷移してきても結果は同じなのですが、 一度ブラウザ(IE6.0)を閉じて再度接続してセレクトボックスを選択すると 追加したデータが表示されます。 以下が該当するAjax部分のソースです。 var Ajax; function CreateAjax(){ try{ Ajax = new ActiveXObject("Msxml2.XMLHTTP"); return Ajax; }catch(e){ Ajax = new ActiveXObject("Microsoft.XMLHTTP"); return Ajax; } } function fncAjax(strURL, strID){ try{ Ajax = CreateAjax(); Ajax.open("GET",strURL); Ajax.onreadystatechange = function(){ if(Ajax.readyState == 4 && Ajax.status == 200){ var obj = document.getElementById(strID); obj.innerHTML = Ajax.responseText; } } Ajax.send(null); }catch(e){ alert(e.description); } } function js_OnSelChange(){ try{ fncAjax("http://hogehoge.com/?key=" + document.form.selectdata.value, "ID"); }catch(e){ alert(e.description); } } どなたか対応策をご存知でしたら、ご教授願いいます。 以上。

  • 無名関数内の変数のreturn

    httpObj.onreadystatechange = function() { if ((httpObj.readyState == 4) && (httpObj.status == 200)) { var data = httpObj.responseText.split(","); Ajaxで非同期通信をしています。 ステータスチェックをして、respinseTextを受け取るのですが、この変数dataをどうしてもreturnしたいのです。 このままだと、当然ローカル変数なのでreturnできません。 前に同じ質問をして、同期通信にすればよいのでは?とアドバイスをいただいたのですが、今回はどうしても非同期通信を行いたいのです。 変数varをそのまま別の関数の引数にする、という方法では解決できずに困っております。 何かよい方法があれば、アドバイスをお願いします。

  • 関数の中の値を取り出したい

    prototype.jsを使って送信して返ってくるデータを、 onCompleteの関数の中で「ret」に値を入れてると思うのですが、 出ててきたときにはalertで表示されません。 どうすればこの形でその関数の中の値を取り出すことができるのでしょうか? function get_data() { ret = ""; new Ajax.Request( "test.php", { method: "get", parameters: "test=aaa", onComplete: function(httpObj){ ret = httpObj.responseText; } } ); alert(ret); return ret; }

  • DOMの種類を一覧できるサイト

    今はやりのAjax用関数で以下のようなものがあります。 function createXMLHttpRequest(){ var XMLhttpObject = null; try{ XMLhttpObject = new XMLHttpRequest(); }catch(e){ try{ XMLhttpObject = new ActiveXObject("Msxml2.XMLHTTP"); }catch(e){ try{ XMLhttpObject = new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){ return null; } } } return XMLhttpObject; } IEやそれ以外のブラウザで利用可能なActiveXObject(DOM)を選択できるようになっていますが、ここで使われているMsxml2.XMLHTTPやMicrosoft.XMLHTTPのようなDOMがたくさんリストアップされているサイトを探しています。最初にこの関数を作った人はどうやってこれらのDOMを見つけたのか気になりますし、自分で似たような関数を作ってみたいので。どうか情報提供をお願いいたします。

  • 代入ができない。(undefined)

    環境:XP SP2, IE6/php, html, javascript submitした際にjavascriptの関数(getNo())が呼ばれ、その関数内で代入ができず参っています。 .php ----- <? $setNo = [111,222,333,444,555]; for($i=0;$i<5;$i++) {?> <input type="text" name="no[<?=$i;?>]" value="<?=$setNo[i];?>" id="no"> <?}?> (submit省略) .js ----- function getNo(obj) { var orgNo = document.all("no"); var bufNo = ""; //初期化空 //var bufNo ; //初期化しないと※1 //var bufNo = "huga";//初期化"huga"※2 for(var k=0; k<orgNo.length; k++) {  alert(orgNo[k].value);//k=0なら111と表示される bufNo = orgNo[k].value;//代入してるのに alert(bufNo='+bufNo); //空のまま →代入されてない なぜ?? //alert(bufNo='+bufNo);//※1undefined→代入されてない //alert(bufNo='+bufNo);//※2huga→代入されてない alert(orgNo='+orgNo[k].value);//k=0のときなら111と表示される } .jsには他にもsubmitから呼ばれている関数があり それらは正常に動作しますが、この関数だけおかしいので 書き直してみたりしましたが改善されません。 また、関数内で配列も宣言してますが、 配列要素にfor文のiなどを[i]のようにいれても、配列の値がうまく変数に代入できません。 ただし、[0]や[2]と指定すると正しい値が表示され、代入もできます。 undefinedになることが問題なのではなく 代入されない理由がわかりません。 どういうことになっているのか教えてください。

  • なぜundefinedになってしまうのでしょうか?

    乱数を配列にして、それを基準にしてランダムに処理を実行させたいのですが、 なぜかarrayRandomNum[0]がundefinedになります。 配列の始めのインデックスに当たる数値を取得できると考えていたのですがなぜundefinedになってしまうのでしょうか? let arrayRandomNum = [randomNumFunk(2)]; console.log(arrayRandomNum[0]); function randomNumFunk(count) { var generatedArray = []; var generatedCount = generatedArray.length; for(var i = 0 ; i < count; i++){ var candidate = Math.floor(Math.random() * count); for(var j = 0; j < generatedCount; j++) { if(candidate == generatedArray[j]){ candidate = Math.floor(Math.random() * count); j= -1; } } generatedArray[i] = candidate; generatedCount++; } return generatedArray; };

  • JavaScriptのDebugが出来るソフト

    お世話になります。 現在、JavaScriptとAjaxのプログラムを組みましたが、非常に細かいところの差異で上手く動いたり、動かなかったりします。 つきましては、JavaScript、Ajax、PHPでのプログラム作成においてDebugができるソフトがあればご紹介下さい。 【一例】 下記コードのcheckとcheck()の違いで上手くいきませんでした。 <html> <head> <meta http-equiv=content-type" content="text/html;charset=utf-8"> <title>Web_data_source</title> <script type="text/javascript"><!-- function getFile() { filename = prompt("test_web.txt","http://localhost/test_web.txt"); //filename = prompt("test_web.txt","http://www.yahoo.co.jp/"); if (!filename) return; xmlhttp = createXMLHttp(); // xmlhttp = xhtttp alert("OK1"); alert(xhttp); if (xhttp !=null) { //alert("ok2-4") xhttp.onreadystatechange = check;←ここの()有る無しで動きませんでした。 xhttp.open("GET",filename,true); //alert("OK2") xhttp.send(null); } //} function check() { if (xhttp.readyState == 4 && xhttp.status == 200) { document.aForm.tArea.value = xhttp.responseText; //document=xhttp.responseText; alert("OK"); }else{ alert("NG"); alert(xhttp.readyState); alert(xhttp.status); } } // XMLHttpオブジェクト作成 function createXMLHttp() { try { //return new ActiveXObject("Msxml2t.XMLHTTP"); //IE用 //alert("OK4"); xhttp= new XMLHttpRequest(); //Firefox用 alert("OK3"); }catch(e){ try { xhttp = new ActiveXObject("Msxml2t.XMLHTTP"); alert("OK3-1"); }catch(e2){ try { xhttp= new ActiveXObject("Microsoft.XMLHTTP") // return null; alert("OK3-2"); }catch(e3){ xhttp= null; } } } } } --></script> </head> <body> <form name="aForm"> <input type="button" value="get file" onClick="getFile()"><br> <textarea cols="40" rows="20" id="tArea"></textarea> </body> <html> 宜しくご回答頂けます様お願いします。

  • javascript : undefinedについて

    プログラム書き始めの初心者なのですがjavascriptでの「undefined」の表示に困っています。 prototype.jsを使っています。 以下がプログラムの一部なんですが MyPhotoObj= new Object(); //var MyPhotoObj.curUser; //var MyPhotoObj.curPic; var j=0; window.onload= function(){ // command syntax: MyPhotoR.html?room=Demo&user=ikeda&role=s&ctrl=1&w=320&h=240 //alert("MyPhotoOnLoad="+location.href); MyPhotoObj.MyDir=location.href.substring(0,location.href.indexOf("/MyPhotoR")+1); //alert(MyPhotoObj.MyDir); var keys= location.search.split("&"); MyPhotoObj.room=keys[0].split("=")[1]; MyPhotoObj.myName=keys[1].split("=")[1]; MyPhotoObj.curUser=keys[2].split("=")[1]; MyPhotoObj.role=keys[3].split("=")[1]; MyPhotoObj.ctrl=keys[4].split("=")[1]; MyPhotoObj.mess=keys[5].split("=")[1]; var width=53; var height=40;    ・・略・・ デバッグすると、 MyPhotoObj.myName=keys[1].split("=")[1]; の行で keys[1] is undefined というエラーがでます。 なぜでしょうか? 宜しくお願いします。

専門家に質問してみよう