プロが教えるわが家の防犯対策術!

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

A 回答 (5件)

//var bufNo ; //初期化しないと※1



それから、今件とは直接関係ないですが、エラーになるならないにかかわらず、初期化はしたほうがいいですよ。

何もしなくても undefined を代入してくれるので 昔見たく、ゴミが入るということはないと思いますが、変数が多態になったおかげで、型指定を怠ってつまらないエラーを起こしてしまうこともありえます。

var v;
v[0] = 3; // エラー
オブジェクト、又は配列でもないのに添え字でアクセスしていることが原因。
    • good
    • 0

>現状は、IEのエラーで「'k'は宣言されていません」というエラーが出るようになりました。



可能性としては orgNo['k'].value となってる、または、k のプロパティにアクセスしてる(エラー内容から見てこちらの可能性は低い)。.js も PHP で吐き出してないですか。

とりあえず、エラー行数みて、ほんとに for(var k=0; k<orgNo.length; k++) ここで起きてるのか確認してみてください。

サンプルコードもなるべくちゃんと閉じたものを提示していただいたほうがいいと思います。 } だけでなく、alert(bufNo='+bufNo); → alert('bufNo='+bufNo);とかも。
    • good
    • 0

ごめ。

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

while(inputElement = obj.elements['no['+(i++)+']']){

この回答への補足

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

補足日時:2008/12/10 13:44
    • good
    • 0

まずは、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. …

今の場合は、変数の内容も出力したいということなので、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-html401 …

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);
}
}
    • good
    • 0

PHP出力部分と同期が取れてないのではないでしょうか?


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

この回答への補足

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

補足日時:2008/12/09 12:46
    • good
    • 0
この回答へのお礼

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

※質問の.jsの部分のfunctionの終わり括弧が抜けていますが、PGは正しく書いてあります。

お礼日時:2008/12/09 22:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!