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

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

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

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

JavaScript

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

Q&A

解決済

2回答

871閲覧

自動的に追加された行の情報を追加した行の情報として扱いたい。

test1234

総合スコア8

PHP

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

JavaScript

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

0グッド

0クリップ

投稿2021/07/21 07:40

編集2021/08/02 23:37

■やりたいこと
自動的に追加された行の情報を追加した行の情報として扱いたい。

■実施したこと
INPUTテキスト「mail」のフォーカスを外した際、新たに1行追加されますが、
追加された行の「mail」欄に入力後、実行すると追加行が1行目に反映されてしまいます。
下記部分のname要素内の配列変数をname='Email[]'にするとうまく行きますが、
今度はSUBMIT時にフォーカスされた要素の取得ができなくなります。両方とも実装したいです。

php

1<td><input type='mail' name='Email[$i]' class='mail' value = '".$Email[$i]."' ".$focus['Email['.$i.']'].">".$email_in."</td>
名前mail
1行目1行目
2行目2行目

1行目の「mail」のフォーカスを外すと2行目が自動的に表示
実行すると2行目のmail欄に入力した情報が1行目のmail欄に反映されてしまう。

下記、全行

javascript

1//最後にフォーカスされた要素を取得する処理 2<script> 3document.addEventListener('formdata',e=>{ 4 e.formData.append('focus',document.activeElement.name); 5}); 6</script> 7 8//mail欄のフォーカスが外れると1行追加される処理 9<script> 10$(function(){ 11 $('input.mail').on('blur', function(){ 12 $('#tbl tbody tr:last-child').clone(true).appendTo('#tbl tbody'); 13 }); 14}); 15</script>

php

1$focus=["Email"=>""]; 2$focus[filter_input(INPUT_POST,"focus")]=" autofocus"; 3 4echo" 5<form method='POST'> 6<table id='tbl'> 7<thead> 8<tr><th>名前</th><th>mail</th></tr> 9</thead> 10<tbody> 11"; 12$i = 1; 13while( $i < 2 ){ //max「2」としていますが、DBに登録されているレコード分表示させる予定です。  14 echo" 15 <tr> 16 <td><input type='text' name='お名前' value='".$name[$i]."' ".$focus['お名前']."></td> 17 <td><input type='mail' name='Email[$i]' class='mail' value = '".$Email[$i]."' ".$focus['Email['.$i.']'].">".$email_in."</td> 18 </tr> 19 "; 20 $i++; 21} 22echo" 23</tbody> 24</table> 25<input type='submit' value='保存'> 26</form> 27";

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

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

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

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

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

yambejp

2021/07/21 08:15 編集

> 1行目の「mail」のフォーカスを外すと2行目が自動的に表示 どの記載で実装しているのでしょうか? $nameや$Emailとかも唐突に記載されていてなんだかわかりません
test1234

2021/07/21 08:16

こちらになります。 //mail欄のフォーカスが外れると1行追加される処理 <script> $(function(){ $('input.mail').on('blur', function(){ $('#tbl tbody tr:last-child').clone(true).appendTo('#tbl tbody'); }); }); </script>
yambejp

2021/07/21 08:36

PHP関係ないですねblur処理で行を空で追加したいだけですね?
guest

回答2

0

ベストアンサー

何をどうしたいのかイマイチ伝わってきませんが

javascript

1 2<?PHP 3$focus=filter_input(INPUT_POST,"focus"); 4$Email=filter_input(INPUT_POST,"Email",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY)?:[""]; 5$count=is_array($Email)?count($Email):1; 6?> 7<script> 8document.addEventListener('formdata',e=>{ 9 e.formData.append('focus',document.activeElement.name); 10}); 11</script> 12 13<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 14<script> 15$(function(){ 16 $('input.mail').on('blur', function(){ 17 var newname=$('#tbl tbody tr:last-child [type=mail]').attr('name').replace(/\d+/,r=>Number(r[0])+1); 18 $('#tbl tbody tr:last-child').clone(true).find('[type=mail]').attr('name',newname).end().find('input').val("").end().appendTo('#tbl tbody'); 19 }); 20}); 21</script> 22<form method='POST'> 23<table id='tbl'> 24<thead> 25<tr><th>名前</th><th>mail</th></tr> 26</thead> 27<tbody> 28<?PHP 29for($i=0;$i<$count;$i++){ 30?> 31<tr> 32<td><input type='text' name='お名前' value=''></td> 33 <td><input type='mail' name='Email[<?=$i?>]' class='mail' value = '<?=htmlspecialchars($Email[$i])?>' <?=$focus=="Email[$i]"?"autofocus":""?> ></td> 34</tr> 35<?PHP 36} 37?> 38 </tbody> 39</table> 40<input type='submit' value='保存'> 41</form>

textのほうが「お名前」というnameだと値は引き継げなさそうですけど

投稿2021/07/21 09:30

yambejp

総合スコア115008

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

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

test1234

2021/07/30 07:32 編集

確認しました。やりたいことと合致しています! $focus=="Email[$i]"?"autofocus":"" の部分ですが、phpの記述で書きたいのですが、どのように記載すればよろしいでしょうか。
taketoma

2021/08/03 11:59

「まだ回答を求めています」となっていたのでコメントします。 $focus=="Email[$i]"?"autofocus":"" の部分は、phpの記述だと思うので望まれてる回答だと思います。
test1234

2021/08/04 01:17

この部分でエラーになってしまいます。ダブルクォーテーションをシングルにしても同様でした。。。
yambejp

2021/08/04 01:41

私の環境ではエラーはでません ご利用のPHPのバージョンと、具体的なエラー内容を提示下さい
test1234

2021/08/04 02:03

php7.4.20です。 すみません、エラーではなく、フォーカス位置の記憶ができなくなりました。 全体を<?php~?>で括っているプログラムの書き方をしており、echoで下記のように記述しました。 echo " <tr> <td><input type='text' name='お名前' value=''></td> <td><input type='mail' name='Email[$i]' class='mail' value = '$Email[$i]' $focus=='Email[$i]'?'autofocus':'' ></td> </tr> ";
yambejp

2021/08/04 02:26

echoの中で変数以外の式を評価させようとするのはNGです こんなふうにしてください <?PHP for($i=0;$i<$count;$i++){ $autofocus=$focus=="Email[$i]"?'autofocus':''; echo <<<eof <tr> <td><input type='text' name='お名前' value=''></td> <td><input type='mail' name='Email[$i]' class='mail' value = '$Email[$i]' $autofocus ></td> </tr> eof; } ?>
test1234

2021/08/04 04:49

できました!ありがとうございます。もう一点お聞きしたいのですが、下記が理解できません。どのような処理でしょうか。POSTした際に変数$Emailが正しく反映されないことがあります。 $Email=filter_input(INPUT_POST,"Email",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY)?:[""];
yambejp

2021/08/04 04:57

Emailというパラメータで渡されたpostデータを配列に受けています もしEmailというパラメータ要素がないなら空文字一つ設定した配列 になるように工夫しています。 >POSTした際に変数$Emailが正しく反映されない 具体的にどういう場合か例示下さい
test1234

2021/08/04 05:06

行を11行目以上増やすと3行目のEmailが消えてしまいます。
FKM

2021/08/04 15:20

postのmaxサイズがオーバーしてませんかね?
test1234

2021/08/04 23:42

設定は8Mとなっています。特にファイルのアップロード等行っているわけではないので、そこまで容量はないと思うのですが。
FKM

2021/08/05 00:10

その11行目のEmailはどんな値が入ってきても消えますか?それともその11行目に来ているメールに、なにかエスケープが必要な値が混じっていて、それがたとえば1行目に来てもエラーが来るかどうか検証してみましょう。
test1234

2021/08/05 00:55

どんな値でも同じです。すみません、最初の質問内容はyambejpさんにご回答頂いた内容で解決しておりますのでベストアンサーでクローズさせて頂きます。私が色々手を加えて質問の内容がずれてしまいました。改めて新規の質問として書き込みさせて頂きます。
test1234

2021/08/11 02:14

すみません、下記部分の処理がどのような処理なのか教えていただけますでしょうか。 var newname=$('#tbl tbody tr:last-child [type=mail]').attr('name').replace(/\d+/,r=>Number(r[0])+1); $('#tbl tbody tr:last-child').clone(true).find('[type=mail]').attr('name',newname).end().find('input').val("").end().appendTo('#tbl tbody');
FKM

2021/08/11 08:19

var newname=$('#tbl tbody tr:last-child [type=mail]').attr('name').replace(/\d+/,r=>Number(r[0])+1); tbody trタグの最終tdタグが持っているinput type="mail"のプロパティ、nameの値を取得してその序数を1インクリメントする 後半はわかると思います。
guest

0

name属性はEmail[]にして

フォーカスされた要素を取得する処理を次のようにする良いかもしれません。

javascript

1document.addEventListener('formdata',e=>{ 2 var elements = [].slice.call( document.querySelectorAll('[type="mail"]')); 3 var index = elements.indexOf(document.activeElement); 4 e.formData.append('focus', 'Email['+(index+1)+']'); 5});

何番目のtype="mail"の要素がフォーカスされているかで判定しています。

投稿2021/07/21 09:02

webgoto

総合スコア1293

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

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

test1234

2021/07/30 07:33

ありがとうございます。ご提示いただいたソースで試してみましたが、変わらずでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問