• 締切済み

代入ができない。(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になることが問題なのではなく 代入されない理由がわかりません。 どういうことになっているのか教えてください。

みんなの回答

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.5

//var bufNo ; //初期化しないと※1 それから、今件とは直接関係ないですが、エラーになるならないにかかわらず、初期化はしたほうがいいですよ。 何もしなくても undefined を代入してくれるので 昔見たく、ゴミが入るということはないと思いますが、変数が多態になったおかげで、型指定を怠ってつまらないエラーを起こしてしまうこともありえます。 var v; v[0] = 3; // エラー オブジェクト、又は配列でもないのに添え字でアクセスしていることが原因。

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.4

>現状は、IEのエラーで「'k'は宣言されていません」というエラーが出るようになりました。 可能性としては orgNo['k'].value となってる、または、k のプロパティにアクセスしてる(エラー内容から見てこちらの可能性は低い)。.js も PHP で吐き出してないですか。 とりあえず、エラー行数みて、ほんとに for(var k=0; k<orgNo.length; k++) ここで起きてるのか確認してみてください。 サンプルコードもなるべくちゃんと閉じたものを提示していただいたほうがいいと思います。 } だけでなく、alert(bufNo='+bufNo); → alert('bufNo='+bufNo);とかも。

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.3

ごめ。訂正。 while(inputElement = obj.elements['['+(i++)+']']){ ↓ while(inputElement = obj.elements['no['+(i++)+']']){

9pinkapple
質問者

補足

ご指摘ありがとうございます。改修している身としては現状で正常動作している部分を書き変えたくはないのでやれるところは参考にさせていただきましたが、まだ改善していません。 昨日が動いてた部分が、今日は動かなかったりとまったく手がつきません。ただ、追加した部分を除くと正常動作しますので、追加した部分の問題であるとは思います。 jsでvar宣言しているのに、宣言されていませんとIEが判断するのはどういうことからなんでしょうか。 他の方が指摘されている「同期」も気になりますが、そちらも今ひとつ掴めていません。

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.2

まずは、PHP で正しい HTML が出力されているか確認されてはいかがでしょうか? まず、PHP の書き方なんですが、PHP では "" または、echo <<< EOM の内部の変数は展開してくれるので、途中で区切る必要はないです。 区切りたい場合は <?php for($i=0; $i<len; ++$i) : ?> <input type="text" name="" value=""> <?php endfor; ?> のようにします。 http://www.php.net/manual/ja/control-structures.alternative-syntax.php 今の場合は、変数の内容も出力したいということなので、printfを使うとスマートにかけるかと思います。 <?php // short tag を使用すると XHTML でエラーになるので、極力使用しないほうがいいかもしれません。 $setNo = array(111,222,333,444,555); for($i=0;$i<count($setNo);$i++){ printf('<input type="text" name="no[%d]" value="%d">', $i, $setNo[$i]); } ?> # PHP で $setNo = [111,222,333,444,555]; のように配列作成ってできるんですか? 次に HTML ですが、重複する id は つけられないので、別の id をつける必要があります。 http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/struct/global.html#adef-id document.all['no'][0] の書き方もサポートしてくれているようですが、正しい使い方とはいえないでしょう。 そもそも document.all は後方互換プロパティなので、通常は document.getElementById を使用し、サポートしてないようなら document.all としたほうがよいでしょう。 フォーム要素なら、form.elements['no[0]'] などで拾えるので、id をふる必要すらないでしょう。 function getNo(obj){ // obj = form? form として話を進めます。 var inputElement = null; var i = 0; while(inputElement = obj.elements['['+(i++)+']']){ alert(inputElement.name); } }

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

PHP出力部分と同期が取れてないのではないでしょうか? 全体の流れが見えませんが、 inputデータ書き出しが完了してない時点で、 bufNo = orgNo[k].value; が実行されているのでは? alert(orgNo[k].value)文は代入文より時間がかかるので、 たまたま、書き出しが完了後の値が拾えている?

9pinkapple
質問者

お礼

まだ解決に至りません。 現状は、IEのエラーで「'k'は宣言されていません」というエラーが出るようになりました。 for(var k=0; k<orgNo.length; k++) の部分だと思われるのですが、varで宣言しているのに何故でしょうか。 ※質問の.jsの部分のfunctionの終わり括弧が抜けていますが、PGは正しく書いてあります。

9pinkapple
質問者

補足

早々にご回答頂き助かります。 同期・・・以前も別件でこちらで質問させて頂いた時も同期のことを言われました。その辺りが勉強不足のようです。 仰る意味は理解しましたので、早速調べてみます。

関連するQ&A

  • なぜ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; };

  • こちらのソースですが、なぜundefinedがでるのでしょうか?

    こちらのソースですが、なぜundefinedがでるのでしょうか? また、undefinedを消す方法はありますか? よろしくお願いいたします。 <script> window.onload = function(){ var hairetu = Array(1,2,3,4,5,6,7,8,9,10); for(var i=0; i<hairetu.length; i++){ var hoge; if(hairetu[i] % 2 == 0 && hairetu[i] % 3 == 0){ hoge += hairetu[i] + '\n'; }else if(hairetu[i] % 2 == 0){ hoge += hairetu[i] + '\n'; }else if(hairetu[i] % 3 == 0){ hoge += hairetu[i] + '\n'; }else { hoge += hairetu[i] + '\n'; } } alert(hoge); } </script>

  • 配列 代入

    JavaScript初心者です。 配列の代入で困っています。 var nums=new Array(); for(var i=0;i<3;i++){ nums[i]=i; // ☆ } // nums [0,1,2] ☆の行(コード)をnums.push=i; とするとnumsに2しか入っていないのですが、どういう仕組みでしょうか? よろしくお願いします。

  • javascript で undefinedと表示されます

    全ての変数、配列に alert(typeof variable); を試しましたが undefinedが見つかりません。 function a{ var lastdayArray = new Array ('','31','28','31','30','31','30','31','31','30','31','30','31'); var weekArray = new Array ('日','月','火','水','木','金','土'); var a = new Date(); var b = new Date(); var mymonth = a.getMonth()+1; var nextmonth =mymonth +1 ; var myyear = a.getYear()+1;   var today = a.getDate(); var maxbox = 36; var sday = a.setDate(1); var nday = b.setDate(1); var nmonth = b.setMonth(mymonth); var nwday = b.getDay(); var fwk = a.getDay(); var nfday = 6 - nwday; var fline = 6 - fwk; var nextlsday = lastdayArray[mymonth]; var lsbox = (fwk + lastdayArray[mymonth]) +1; var monthArray = new Array(mymonth,nextmonth); var monthflg = new Array(fwk,nfday); var nextflg = new Array(fline,nwday); var s_no0 = 1;   var s_no1 = 1; //数値代入変数       var s_no2 = 1; var s_no3 = 0; var s_no4 = 0; var s_no5 = 0; var s_no6 = 0; var s_no7 = 0; var s_no8 = 0; var schedule_no = new Array(s_no0,s_no1,s_no2,s_no3,s_no4,s_no5,s_no6,s_no7,s_no8); var s_str0 = 'a'; var s_str1 = 'a'; //文字列代入変数 var s_str2 = 'a'; var s_str3 = 'a'; var s_str4 = 'a'; var s_str5 = 'aa'; var s_str6 = 'a'; var s_str7 = 'a'; var s_str8 = 'a'; var schedule_str = new Array(s_str0,s_str1,s_str2,s_str3,s_str4,s_str5,s_str6,s_str7,s_str8); for(var x = 0; x < 2; x++){ daycount = 0; document.write(monthArray[x] + '月の予定'); if(nmonth == 12){nmonth = 0;} document.write('<table width="73%" height="337" border="1" cellpadding="1" cellspacing="1">'); //曜日出力 document.write('<tr>'); for(var l = 0 ; l <= 6; l ++){ if(l == 0){ weekArray[l] = (weekArray[l].fontcolor('#ff1493').fontsize(4)); } else if(l == 6){ weekArray[l] = (weekArray[l].fontcolor('#87ceeb').fontsize(4)); } document.write('<td>' + weekArray[l] +'</td>');} document.write('</tr>'); //曜日を判定しテーブル出力 document.write('<tr>'); //空ボックス出力 if((monthflg[x]) != 6 ){ for(var k = 0; k < (monthflg[x]); k++){ document.write('<td>' + '&nbsp;' +'</td>'); } } if((monthflg[x]) == 0){ for(var y = 0; y < 6 ; y++){ document.write('<td>' + '&nbsp;' +'</td>'); } if((schedule_no[y]) === daycount){ daycount ++; document.write('<td>' + daycount + schedule_str[y] +'</td>'); } else { daycount ++; document.write('<td>' + daycount +'</td>'); } } else{ //空ボックスの数~土曜日まで出力 for(var m =0 ; m <= nextflg[x]; m++){ if((schedule_no[m]) === daycount){ daycount ++; document.write('<td>' + daycount + schedule_str[m] +'</td>'); } else { daycount ++; document.write('<td>' + daycount +'</td>'); } } } document.write('</tr>'); //行出力 for(var i =0 ; i < 4; i++){ document.write('<tr>'); //列出力 for(var j =0 ; j < 7; j++){ if(daycount < lastdayArray[monthArray[x]]){ daycount ++; document.write('<td>' + daycount +'</td>'); } else{ document.write('<td>' + '&nbsp;' +'</td>'); } } document.write('</tr>'); } //最終行出力 if(daycount < lastdayArray[monthArray[x]]){ document.write('<tr>'); for(var p =0 ; p < 7 ; p++){ if(daycount < lastdayArray[monthArray[x]]){ if((schedule_no[p]) === daycount){ daycount ++; document.write('<td>' + daycount + schedule_str[p] +'</td>'); } else { daycount ++; document.write('<td>' + daycount +'</td>'); } } else{ document.write('<td>' + '&nbsp;' +'</td>'); } } document.write('</tr>'); } document.write('</table>'); } }

  • 配列の格納

    現在、PHPで生成したhiddenフィールドに、Valueを設定しない記述(配列のような形式)を行い、JavaScriptにて値を代入するプログラムを作っています。 エラーは出ていないようなのですが、値が代入されません。Alertでみると、undefinedというメッセージが出ています。hiddenフィールドへの格納方法をご教授ください。 <ソース>(抄) function user_num() { var i=1,l=0, num = document.getElementById('users').length; document.user_select.user_no =new Array(num); while(num > 0){ document.getElementsByName('user_no[i]').value = document.getElementById('users').options[l].value; alert(document.getElementsByName('user_no[i]').value); num--; i++; l++; } } (中略) hiddenフィールド生成文 <?php $n=1; while($i){ print '<input type="hidden" name="user_no['; print $n; print ']"'; print ' id="user_no['; print $n; print ']">'; $i=$i-1; $n=$n+1; } ?>

  • TypeError: undefinedのエラー

    javascriptの学習中ですが google script Editorにて実行時に以下のエラーが表示されて配列に文字列がセットできません。 「TypeError: undefined のプロパティ「0.0」を「2017年02月23日(木)」に設定できません。(行 8、ファイル「test」)」 //bentoという2次元配列に日付とメニューをセットしたい function myFunction() { var textDate = ["2017年02月23日(木)","2017年02月24日(金)","2017年02月25日(土)"]; var textMenu = ["チキンカツ","カレー","からあげ"]; var bento = new Array(); var j = 0; for(var i = 0; i < textDate.length; i++){ Logger.log(bento); bento[i][j] = textDate[i]; for(j = 0; j < textMenu.length; j++){ bento[i][j + 1] = textMenu[j]; } j = 0; } } //Logger.logで出力されたログ //[17-02-23 07:18:14:605 JST] []

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

  • 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 というエラーがでます。 なぜでしょうか? 宜しくお願いします。

  • エラー理由が解らない

    JavaScript初心者ですが 以下の関数でエラーがでるのですが、理由がわかりません。 配列変数は別ソースにてテストしていますが問題なく定義されています。 function total(){ for(var i = 0; i <= ItemQty.length; i++){ window.alert((document.form1.elements[ItemQty[i]].value)*(document.form1.elements[Itemlen[i]].value)*SptVal[i]))  } }

  • 関数内での繰り返し処理の結果を配列で受け取りたい

    関数内でfor文で繰り返し処理を行い、 結果を配列として返すような関数を書きたいと思っています。 function hoge(){ var a = [1,2,3,4]; for (var i=0; i < a.length; i++){ a1 = "a" + i; var arr = new Array(); arr.push(a1); } return arr; } しかし、以下のように 関数hogeの結果を変数bで受け取ってみると、 配列の最後のデータしか表示されません。 var b = hoge(); alert(b); //a3のみが表示される a0, a1, a2, a3と表示されるようにするには、 どうしたらよいでしょうか。