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

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

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

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

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

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2426閲覧

cloneNode(true)で複製したボタンで繰り返し複製を行いたい

hi-roto

総合スコア8

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

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

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/05/28 14:46

前提・実現したいこと

javascriptにて、「追加ボタン」を押すことでcloneNode(true)でコピーした要素が複製して追加されるようにしたいです。
複製はきちんとできています。
しかし、イベント発火する対象のボタンがもともとあったボタンでしか反応しません。

ページ画像

実現したいこと

  • 「追加ボタン」を押す
  • イベント発火して複製した要素が下に追加される
  • 追加した要素内に新たに設置した「追加ボタン」を押す
  • 複製される

という繰り返しを行いたいのですが、イベント発火の対象のボタンを切り替えることができずに困っております。
よろしくお願いいたします。

該当のソースコード

javascript

1window.addEventListener('load', function (){ 2 const createTimeZone = (btnAreaCount) => { 3 let timeAreaCount = document.querySelectorAll(".container").length; 4 let timeArea = document.getElementById(`card-area-${timeAreaCount}`); 5 let cloneElement = timeArea.cloneNode(true); 6 cloneElement.id = `card-area-${timeAreaCount + 1}`; 7 btnElement = cloneElement.querySelector(`#add-btn-${btnAreaCount}`); 8 btnElement.id = `add-btn-${btnAreaCount + 1}`; 9 timeArea.after(cloneElement); 10 }; 11 12 let btnAreaCount = document.querySelectorAll(".addbtn").length; 13 let addBtn = document.getElementById(`add-btn-${btnAreaCount}`); 14 15 addBtn.addEventListener('click', function (){ 16 createTimeZone(btnAreaCount); 17 btnAreaCount += 1; 18 }) 19});

html

1<div> 2 <div class="card-header fixed-bottom text-center"> 3 <h3 id="RealTimeArea1"class="card-title"></h3> 4 </div> 5 6 <div class="container" id="card-area-1"> 7 <div class="card mb-3 shadow-sm text-center"> 8 <div class="card-body"> 9 <div class="container-fluid"> 10 <h5><label for="InputDateTime">現時表示の時刻を選択</label></h5> 11 <input type="datetime-local" class="shadow-sm" style= "width: 190px;" id="InputDateTime"> 12 <input id="InputSecondTime" type="number" class="shadow-sm" placeholder="秒数を入力" style= "width: 110px;" min="0" max="59"><label></label> 13 <button type="button" class="btn btn-primary btn-sm" id="check-current-time">確認</button> 14 <h3 id="RealTimeArea1"class="card-title"></h3> 15 <h2 id="TimeDeference"></h2> 16 <h5><label for="InputDateTimePass">再生中の表示時刻を選択</label></h5> 17 <input type="datetime-local" class="shadow-sm" id="InputDateTimePass" style= "width: 190px;"> 18 <input id="InputSecondTimePass" type="number" class="shadow-sm" placeholder="秒数を入力" style= "width: 110px;" min="0" max="59"><label></label> 19 <button type="button" class="btn btn-primary btn-sm" id="check-correction-time">確認</button> 20 <h2 id ="CorrectionTime"></h2> 21 <div class="text-center addbtn"> 22 <button class="m-2 btn btn-outline-success" style="width: 190px;" id="add-btn-1">追加</button> 23 </div> 24 </div> 25 </div> 26 </div> 27 </div> 28 </div>

問題点

デバッグで確認したところ、複製して追加されたadd-btn-番号は追加するごとに数字が増えるようにできているのですが、複製先のボタンを押した時に、イベント発火元のaddBtnが変化しておらず、複製元のボタンのDOMを取得していることが原因だと思うのですが、変えることができません。

補足情報(FW/ツールのバージョンなど)

OS: mac Bigsur
bootstrap
ブラウザ:chrome

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

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

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

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

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

guest

回答1

0

ベストアンサー

cloneNode()ではイベントリスナは複製されません。
動的に足される要素にイベントリスナを登録するのは面倒なので、ボタンに共通のclassを付けて、document で click イベントを見ればよいです。addBtn.addEventListener(...) は不要です。

ボタンに class="add-button" を付けたとすると、

js

1document.addEventLisetner('click', event => { 2 if (event.target.closest('.add-button')) 3 createTimeZone(btnAreaCount++); 4});

投稿2021/05/28 16:12

編集2021/05/28 16:25
int32_t

総合スコア21695

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

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

hi-roto

2021/05/29 08:29

できました。感動しました。 ボタンごとにgetElementByidでHTMLを取得しないといけないとばかり思ってました。 documentでイベント発火させればいいわけですね。 とても勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問