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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

Q&A

解決済

2回答

1128閲覧

javascriptでHTMLを追加したい

mika_yamano

総合スコア3

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

0グッド

1クリップ

投稿2020/06/08 02:26

クックパットのようなレシピサイトなどによくある+を押したら入力フォームが増えるような仕組みをつくりたいです。

HTML

1 <table class="material_form"> 2 <tr class="add_form"> 3 <th> 4 <input type="text" placeholder="材料" class="material" /> 5 <input type="text" placeholder="分量" class="material" /> 6 <span class="form_plus">+</span> 7 <span class="form_minus">-</span> 8 </th> 9 </tr> 10 </table>

javascript

1 let target_forms = document.querySelectorAll(".add_form"); 2 let plus_forms = document.querySelectorAll(".form_plus"); 3 4 function add_form() { 5 let add_form_html = 6 '<tr class="add_form">' + 7 "<th>" + 8 '<input type="text" placeholder="材料" class="material" /> ' + 9 '<input type="text" placeholder="分量" class="material" /> ' + 10 '<span class="form_plus">+</span> ' + 11 '<span class="form_minus">-</span> ' + 12 "</th>" + 13 "</tr>"; 14 15 target_forms.forEach(target_form => 16 target_form.insertAdjacentHTML("afterend", add_form_html) 17 ); 18 19 } 20 plus_forms.forEach(plus_form => 21 plus_form.addEventListener("click", add_form) 22 );

この方法ですと、最初からHTMLに記載してあるコードの+を押せば新たにHTMLを生成して追加してくれるのですが、新しく生成されたHTMLの+を押しても新たなフォームを生成してくれません。

どうすれば上手く実装出来るでしょうか?

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

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

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

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

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

m.ts10806

2020/06/08 02:28

nameないですが、どのように送信して、受け取る設計ですか?
mika_yamano

2020/06/08 02:33

モーダルでこのコードを表示して、入力された値をrailsのフォームに入れてFPOSTしようと思っています。 もっといい方法があるのかもしれませんが、思いつきませんでした。
m.ts10806

2020/06/08 02:53

>railsのフォームに その前提は書いてあった方が良いかと思います。詳しくはないですがフレームワーク利用ならフレームワークのお作法に則る必要があるでしょうし。 タグを追加、質問に追記してください
guest

回答2

0

ベストアンサー

クリックハンドラーを設定する対象を、より広い範囲にすると、分かりやすく書けます。以下は、table 全体に、クリックハンドラーを設定する例です。

javascript

1document.addEventListener('DOMContentLoaded', function() { 2 3 4 let count = 0; 5 6 const addFormHtml = () => 7 '<tr class="add_form">' + 8 `<td>${++ count}</td>` + 9 "<th>" + 10 '<input type="text" placeholder="材料" class="material" /> ' + 11 '<input type="text" placeholder="分量" class="material" /> ' + 12 '<span class="form_plus">+</span> ' + 13 '<span class="form_minus">-</span> ' + 14 "</th>" + 15 "</tr>"; 16 17 18 function handleTableClick({ target }) { 19 if (target.classList.contains('form_plus')) { 20 target.closest('.add_form').insertAdjacentHTML("afterend", addFormHtml()); 21 } 22 } 23 24 const table = document.querySelector('table'); 25 table.addEventListener("click", handleTableClick); 26 27 28});

なお、上記では、どの+がクリックされても、その+を含む行のすぐ下に行が追加されることを確認できるようにするために、各行の先頭に何番目に追加された行かが分かるように、通し番号のセルを追加しています。

投稿2020/06/08 04:04

jun68ykt

総合スコア9058

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

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

mika_yamano

2020/06/09 01:10

これですこの動きです! こういう書き方があったんですね、どうやってぐぐっていいかもわからなかったので本当に助かりました、ありがとうございます!
jun68ykt

2020/06/09 01:39

どういたしまして???? > これですこの動きです! とのことでよかったです???? このご質問の例のように、 「クリックハンドラーをどの要素に設定すると(後々まで)楽か?」 というのは、けっこう考え処だったりします。
mika_yamano

2020/06/10 00:20

バックエンドばかりだったので、中々にjavascript難しいですね???? でも動きがあるのでとても面白くもあります✨ 今回は本当にありがとうございました????
guest

0

イベント移譲をするのがいいかと思いました。
サンプル

js

1 document.addEventListener("click", function(e){ 2 if ( e.target.closest(".form_plus") ) add_form() 3 })

イベントのバブリングとキャプチャリング | イベントの紹介 - ウェブ開発を学ぶ | MDN

Element.closest() - Web API | MDN

投稿2020/06/08 03:11

Lhankor_Mhy

総合スコア36960

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

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

mika_yamano

2020/06/09 01:11

回答ありがとうございます。 こういう書き方もあるのですね、とても参考になりましたありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問