性格悪い人が優勝

JavaScriptの結果値を渡す方法について悩んでします
フォーカス遷移時、関数を呼び出してフォームの入力値から計算してテキストボックスに結果値を
代入するという処理を考えています


<script type="text/javascript">
//--関数
function go(){
$get = 1;

$a_data = parseFloat(document.Data.start_time.value);
$b_data = parseFloat(document.Data.start_time.value);
$c_data = parseFloat(document.Data.start_time.value);
$d_data = parseFloat(document.Data.start_time.value);

document.Data.Answer.value = $a_data - $get;
document.Data.Answer.value = $b_data - $get;
document.Data.Answer.value = $c_data - $get;
document.Data.Answer.value = $d_data - $get;

}

</script>
<?php
$day = 1;
while ($day < 5){
?>
<form name = "Data">
<tr>
<td><select name="<?php echo $day ?>[start_time]" onblur = "go()">
<option value="1" >1</option>
<option value="2" >2</option>
<option value="3" >3</option>
<option value="4" >4</option>
</select>
</td>
<td><input type="text" name = "<?php echo $day ?>[Answer]" readonly value="" style=width:40px></td>
</tr>
</form>
<?php
$day++;
}
?>
関数内で結果を渡そうとしているdocument.Data.Answer.valueの部分がうまく指定でいていないため
valueに代入できていないのでは?と思っています。
よろしくお願いします。

A 回答 (3件)

#1です



すみません、曲解していたようで単なるjavascriptの話でしたね
nameで要素にアクセスするとロクなことがないので
手っ取り早く処理するならidを振ることです。

ざっくりこんな感じで

<script>
function go(){
var get = 1;
for(var i=1;i<5;i++){
var answer=document.getElementById("a"+i.toString());
var start_time=document.getElementById("s"+i.toString());
answer.value=parseFloat(start_time.options[start_time.selectedIndex].value)-get;
//answer.value=parseFloat(start_time.value)-get; //これでもいけるはず
}
}
</script>
<?php
$day = 1;
while ($day < 5){
?>
<form>
<tr>
<td><select name="<?php echo $day ?>[start_time]" id="s<?php echo $day ?>" onblur="go()">
<option value="1" >1</option>
<option value="2" >2</option>
<option value="3" >3</option>
<option value="4" >4</option>
</select>
</td>
<td><input type="text" name = "<?php echo $day ?>[Answer]" id="a<?php echo $day ?>" readonly value="" style=width:40px></td>
</tr>
</form>
<?php
$day++;
}
?>

この回答への補足

回答ありがとうございます。わかりやすかったです。

ただ、わからないところがあって調べてもちょっとつかめたかったのですが
変数の[value]の用途がいまいちわからなかったのですが
変数に直接代入する形ではいけないということですよね。
その参照しているコントロール(document.form,,,)に代入するという意味でよろしいのでしょうか。
その場合は代入するときだけ
変数.value = 計算式,,, のような形だと思います。

また[parseFloat]は文字列を数値に変換する意味だと思うのですが計算式が複数ある場合
計算対象の変数に[parseFloat]で変換し計算するという認識でよろしいでしょうか。

たびたび、申し訳ありませんがよろしくお願いします。

補足日時:2014/08/19 14:47
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
自分のお指摘いただいた点を参考に自分のソースを加筆・修正したところ動作確認で来ましたのでお礼申し上げます。

.netばかりやっていて最近PHPを学習始めたばかりでわからない部分が多々ありますが、参考になりました。

お礼日時:2014/08/19 16:21

よくわかりませんが、こういうことでしょうか



<script>
function go() {
var form = document.forms['data'];
var valueGet = 1;
for (var day = 1; true; day++) {
var startTime = form.elements['startTime' + day];
var answer = form.elements['answer' + day];
if (!startTime || !answer) break;
answer.value = ''+(parseFloat(startTime.value) - valueGet);
}
}
</script>
<form name=data><table>
<?php for ($day = 1; $day < 5; $day++){ ?>
<tr><td>
<select name="startTime<?=$day?>" onblur="go()">
<option value=1>1<option value=2>2<option value=3>3<option value=4>4
</select>
<input type=text name="answer<?=$day?>">
<?php } ?>
</table></form>

注意点
* 繰り返しの処理はループで書きましょう
* JavaScript の変数名に $ は誤解を招くので、使わないほうが良いでしょう
* 変数名 get は誤解を招くので、動詞以外で命名しましょう
* 同名の <form name> が複数あるのは感心しませんので、一つにしましょう

この回答への補足

回答ありがとうございます。

処理のサンプル用ソースをざっと書いたのでループなど忘れてしまいました。
変数名や変数指定などもさっと書いてしまったので紛らわしかったみたいですみません。

動作としてお教えいただいた感じになると思います。ありがとうございます。
フォーカス遷移時に入力値に対して計算するというものです。

お聞きしたいのですが、name属性が少し変わったみたいですがこの場合、[name][$day]の形で取れるということでいいのでしょうか。
また、同名のform nameが複数あるというのは関数の方で
複数使っているということでしょうか。

たびたび申し訳ありません、よろしくお願いします。

補足日時:2014/08/19 10:40
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
お指摘いただいて、変数を変えました。
確かに、JavascriptとPHPで混合して見づらかったです。
ありがとうございました。

お礼日時:2014/08/19 16:19

自覚しているかどうか微妙な質問ですが


かなりおかしい話をしています

javascriptの処理をPHPに戻すことはできない。
やるのであればajaxでデータを再送し、その結果をjavascriptで描画しなおすくらい。
そうでなければGETやPOSTで普通にサーバーにデータを送り
結果をPHPで得ることです。

この回答への補足

回答ありがとうございます。

私の説明が変なことをいっているようなのだと思います。

私としては
コントロールに値を入力、コントロールからフォーカスが外れたときに関数を呼び出します。
その関数内で入力値の計算を行い、結果値をvalueに指定するということを想定しています。

ループ処理をしているのでname属性が2次元配列のような形になっているのですが、
たとえばループ処理しない場合nameは2次元にならないので
valueに代入して結果を表示できます。

また、色々調べたときに関数を呼び出す時に変数を渡して関数内で処理する、結果を変数に代入する。
その結果値を表示するといった方法でもできました。(この方法は自分の実装に合わないようなので方法だけ確認しました。)

なので結果値を渡すときにnameの指定がおかしいのだと思います。

長文失礼しました、よろしくお願いします。

補足日時:2014/08/18 17:14
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2014/08/19 16:19

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