質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

1077閲覧

自動的に追加された行の値が引き継がれない

test1234

総合スコア8

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/08/05 01:10

編集2021/08/10 05:01

■やりたいこと
下記画像ののようなシステムを構築しています。
・数量のフォーカスを外すと1行追加される
・SUBMIT時フォーカスされたinputの位置を保持
ですが、自動的に追加された行の値が引き継がれなくなってしまい、困っています。
上手くいくときもあるのですが、検証してもパターンがわかりません。お手数ですが、ご教示お願いします。

イメージ説明

■検証したところ、追加された行に入力すると配列の引継ぎがうまくできていないようです。 

javascri

1<script> 2$(function(){ 3 $('input.suryo').on('blur', function(){ 4 var newname=$('#tbl tbody tr:last-child [type=text]').attr('name').replace(/\d+/,r=>Number(r[0])+1); 5 $('#tbl tbody tr:last-child').clone(true).find('[type=text]').attr('name',newname).end().find('input').val('').end().appendTo('#tbl tbody'); 6 }); 7}); 8</script>

■不具合時のダンプ
array(2) { [0]=> string(1) "1" [1]=> string(1) "6" } array(1) { [0]=> string(1) "2" } array(1) { [0]=> string(1) "3" }

下記全容

php

1<?PHP 2 3$focus=filter_input(INPUT_POST,'focus'); 4$h_code=filter_input(INPUT_POST,'h_code',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY)?:['']; 5$name=filter_input(INPUT_POST,'name',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY)?:['']; 6$suryo=filter_input(INPUT_POST,'suryo',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY)?:['']; 7var_dump($h_code); 8var_dump($name); 9var_dump($suryo); 10$count=is_array($h_code)?count($h_code):1; 11 12echo" 13<script> 14document.addEventListener('formdata',e=>{ 15 e.formData.append('focus',document.activeElement.name); 16}); 17</script> 18 19<script src='https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js'></script> 20<script> 21$(function(){ 22 $('input.suryo').on('blur', function(){ 23 var newname=$('#tbl tbody tr:last-child [type=text]').attr('name').replace(/\d+/,r=>Number(r[0])+1); 24 $('#tbl tbody tr:last-child').clone(true).find('[type=text]').attr('name',newname).end().find('input').val('').end().appendTo('#tbl tbody'); 25 }); 26}); 27</script> 28<form method='POST'> 29<table id='tbl'> 30<thead> 31<tr><th>コード</th><th>名前</th><th>数量</th></tr> 32</thead> 33<tbody> 34"; 35 36 37for($i=0;$i<$count;$i++){ 38 39 $autofocus_h=$focus=="h_code[$i]"?'autofocus':''; 40 $autofocus_n=$focus=="name[$i]"?'autofocus':''; 41 $autofocus_s=$focus=="suryo[$i]"?'autofocus':''; 42 43 echo " 44 <tr> 45 <td><input type='text' name='h_code[$i]' class='h_code' value = '$h_code[$i]' $autofocus_h ></td> 46 <td><input type='text' name='name[$i]' class='name' value = '$name[$i]' $autofocus_n ></td> 47 <td><input type='text' name='suryo[$i]' class='suryo' value = '$suryo[$i]' $autofocus_s ></td> 48 </tr> 49 "; 50 51} 52 53echo" 54 </tbody> 55</table> 56<input type='submit' value='保存'> 57</form> 58"; 59?> 60

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/08/05 01:13

POSTした情報はそれぞれ想定どおりでしょうか。デバッグしてみてください
test1234

2021/08/05 01:24

質問内容の画像を更新しました。上手くPOSTできていないようです。
FKM

2021/08/05 01:57

普通に動いてますけどね、テストした環境はChromeです。
m.ts10806

2021/08/05 02:03

デバッグの結果をご提示ください。
test1234

2021/08/05 02:11

FKMさんがおっしゃるようにうまく行くこともあるので、どこをどうデバッグすればよいのかわかりません・・・。
m.ts10806

2021/08/05 02:36

入力した内容がきているか出力して確認するだけですよ。
FKM

2021/08/05 02:43

うまく行かないパターンは一度クローンして、そのまま値を入力してENTERした場合でした。 そのまま入力だけしてENTERだとうまくいくようです。
test1234

2021/08/05 02:45 編集

m.ts10806さん そのデバッグであれば画像を更新したのでそちらを参照頂きたいです。値がPOSTできていれば初期値として残るはずですが、2行目に正しく反映されていないです。
test1234

2021/08/10 05:00 編集

引き続き回答受け付けています。
guest

回答1

0

テーブル要素の行をcloneする場合はtrのディープコピーをそのまま使うようにした方がいいです。どうやら手動で作成している部分が悪さをしているようです。また、last-childだと同じ子の列td(name=ho_code[])しか引っ張ってこないので、first-of-typeにしています。

$(function(){ $('input.suryo').on('blur', function(){ $('#tbl tbody tr:first-of-type').clone(true,true).find('input').val('').end().appendTo('#tbl tbody'); }); });

また、filter_inputは自動でnull判定してくれるので、以下の記述で問題ないですし、inputのnameの変数も空オブジェクトで対応できます。

これで希望通りの動きをしてくれるのでは?

php:php

1<?PHP 2 3$focus=filter_input(INPUT_POST,'focus'); 4$h_code=filter_input(INPUT_POST,'h_code',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 5$name=filter_input(INPUT_POST,'name',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 6$suryo=filter_input(INPUT_POST,'suryo',FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 7var_dump($h_code); 8var_dump($name); 9var_dump($suryo); 10$count=is_array($h_code)?count($h_code):1; 11 12echo" 13<script> 14document.addEventListener('formdata',e=>{ 15 e.formData.append('focus',document.activeElement.name); 16}); 17</script> 18 19<script src='https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js'></script> 20<script> 21$(function(){ 22 $('input.suryo').on('blur', function(){ 23 $('#tbl tbody tr:first-of-type').clone(true,true).find('input').val('').end().appendTo('#tbl tbody'); 24 }); 25}); 26</script> 27<form method='POST'> 28<table id='tbl'> 29<thead> 30<tr><th>コード</th><th>名前</th><th>数量</th></tr> 31</thead> 32<tbody> 33"; 34 35 36for($i=0;$i<$count;$i++){ 37 38$autofocus_h=$focus==$h_code[$i]?'autofocus':''; 39$autofocus_n=$focus==$name[$i]?'autofocus':''; 40$autofocus_s=$focus==$suryo[$i]?'autofocus':''; 41 echo " 42 <tr> 43 <td><input type='text' name='h_code[]' class='h_code' value = '$h_code[$i]' $autofocus_h ></td> 44 <td><input type='text' name='name[]' class='name' value = '$name[$i]' $autofocus_n ></td> 45 <td><input type='text' name='suryo[]' class='suryo' value = '$suryo[$i]' $autofocus_s ></td> 46 </tr> 47 "; 48 49} 50 51echo" 52 </tbody> 53</table> 54<input type='submit' value='保存'> 55</form> 56"; 57?>

投稿2021/08/05 02:38

編集2021/08/05 08:15
FKM

総合スコア3647

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

test1234

2021/08/05 05:48

フォームの処理的には問題ありません!ただ、「SUBMIT時フォーカスされたinputの位置を保持」ができないです。
test1234

2021/08/05 05:54

下記にするとinputのフォーカスは保持されますが、今度はPOSTがうまく行きません(2行目に入力した値が1行目に反映され、1行だけになる)。 <td><input type='text' name='h_code[$i]' class='h_code' value = '$h_code[$i]' $autofocus_h ></td> <td><input type='text' name='name[$i]' class='name' value = '$name[$i]' $autofocus_n ></td> <td><input type='text' name='suryo[$i]' class='suryo' value = '$suryo[$i]' $autofocus_s ></td>
FKM

2021/08/05 08:11

focusのところ変数になってなかったですね 先程の回答を以下に差し替えてみてください。これでいけるかと $autofocus_h=$focus==$h_code[$i]?'autofocus':''; $autofocus_n=$focus==$name[$i]?'autofocus':''; $autofocus_s=$focus==$suryo[$i]?'autofocus':'';
test1234

2021/08/05 08:18

フォームの処理的には問題ありませんが、「SUBMIT時フォーカスされたinputの位置を保持」ができませんでした。。。
FKM

2021/08/05 09:01 編集

現状だとautofocusの取得部分に誤りがありますね。方法としては activeElementを使って対象のinputの番号を取得、それをhiddenに格納してPHP内で突き合わせ これで対処できるはずです。
test1234

2021/08/05 08:23

はい、差し替え頂いたものをコピペしても同じでした。EnterキーでSUBMITしても、「保存」ボタンを押しても、最終フォーカスが保持されません
test1234

2021/08/05 08:23

phpのバージョンは7.4.20です
FKM

2021/08/06 00:46

$autofocus_?に代入される部分を追跡すればそのフォーカス部分がなぜ今の記述のままじゃ駄目なのかわかると思いますよ。
test1234

2021/08/06 00:54

追跡すると、cloneで追加された行だけSUBMIT前に値を入力すると先頭の”h_code”がフォーカスされてしまいます。
FKM

2021/08/06 01:18

var_dump($focus)をプログラム中に記述して、本当に欲しい$focusの値が代入されているか追跡してみてください。
test1234

2021/08/06 01:28 編集

はい、それは既に実施しております。「cloneで追加された行だけSUBMIT前に値を入力すると先頭の”h_code”がフォーカスされてしまいます。」一度submitした後であれば、inputの値もフォーカス位置も保持されますが、CLONEされた直後だけうまく行きません。
test1234

2021/08/06 01:57

すみません、「activeElementを使って対象のinputの番号を取得、それをhiddenに格納してPHP内で突き合わせ」この記述方法がわからないのでご教示頂きたいです。
FKM

2021/08/06 06:43

行の値は引き継がれているんですよね。そことは別問題のロジックになります。 要はフォーカスしたx番目のinputタグの序数をスクリプト内でhiddenのvalueに格納して、それとループ文のインデックス番号を突き合わせ、一致しているときにautofocusを代入するというやり方です。
test1234

2021/08/06 06:58

>>それとループ文のインデックス番号を突き合わせ、一致しているときにautofocusを代入するというやり方です。 これは理解できているのですが、 >>フォーカスしたx番目のinputタグの序数をスクリプト内でhiddenのvalueに格納 この書き方がわからず困っています。
FKM

2021/08/06 07:00

フォーカスしたinputはdocument.activeElementで取得できます。これをイベントメソッドと合わせます。
test1234

2021/08/06 07:06

話が戻ってしまうのですが、ですので2つ前のコメント「activeElementを使って対象のinputの番号を取得方法がわからない」と記述しました。activeElementの使い方をインターネットで調べてもフォーカスしたinputの行番号まで取得する方法がわかりませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問