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

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

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

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

PHP

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

JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

HTML

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

Q&A

解決済

2回答

2562閲覧

JavaScript テンプレートリテラルに変数の内容が反映されない。

Patao_program

総合スコア22

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

PHP

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

JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

HTML

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

0グッド

0クリップ

投稿2021/09/12 00:34

前提・実現したいこと

ボタンを押すたびにアコーディオンを増やすことを実装しようとしています。そのため他の要素と差別化するために、テンプレートリテラルを使って、要素に連番を付けたいと思っています。

発生している問題・エラーメッセージ

addAccordion関数を使って、アコーディオンをメインのhtmlに結合させているのですが、console.log(accordionCount)実行すると、数が1ずつ増加しているのですが、肝心の追加したhtml要素は連番ではなく、初期値の1が入ってしまいます。なぜ、htmlにしっかりと連番が反映されないのでしょうか?

jsはwebpackでコンパイルして読み込ませています。

該当のソースコード

javascript

1'use strict'; 2 3let accordionCount = 1; 4const list = document.getElementById('list'); 5console.log(list, 'リスト'); 6 7const html = ` 8<li id="question${accordionCount}" class="w-full mx-auto"> 9<div class="shadow-md"> 10<div class="tab w-full overflow-hidden border-t"> 11<input class="absolute opacity-0" id="tab-single-one" type="radio" name="tabs2" /> 12<label class="block p-5 leading-normal cursor-pointer" for="tab-single-one">第${accordionCount}問</label> 13<div class="tab-content overflow-hidden border-l-2 bg-gray-100 border-yellow-500 leading-normal"> 14<div class="p-5"> 15<div class="my-2"> 16<label class="block" for="description">問題</label> 17<textarea name="question${accordionCount}" placeholder="問題文" 18class="w-full focus:outline-none border focus:border-yellow-300" id="question${accordionCount}" 19name="question${accordionCount}" type="text"></textarea> 20</div> 21<div class="my-2"> 22<label class="block" for="${accordionCount}_choice1">選択肢1</label> 23<input required name="correct_choice1" value="${accordionCount}_choice1" type="radio"> 24<input required class="w-11/12 focus:outline-none border focus:border-yellow-300" 25placeholder="選択肢1" id="${accordionCount}_choice1" name="${accordionCount}_choice1" type="text"> 26</div> 27<div class="my-2"> 28<label class="block" for="${accordionCount}_choice1">選択肢2</label> 29<input required name="correct_choice1" value="${accordionCount}_choice2" type="radio"> 30<input required class="w-11/12 focus:outline-none border focus:border-yellow-300" 31placeholder="選択肢2" id="${accordionCount}_choice1" name="${accordionCount}_choice2" type="text"> 32</div> 33<div class="my-2"> 34<label class="block" for="${accordionCount}_choice1">選択肢3</label> 35<input required name="correct_choice1" value="${accordionCount}_choice3" type="radio"> 36<input required class="w-11/12 focus:outline-none border focus:border-yellow-300" 37placeholder="選択肢3" id="${accordionCount}_choice1" name="${accordionCount}_choice3" type="text"> 38</div> 39<div class="my-2"> 40<label class="block" for="${accordionCount}_choice1">選択肢4</label> 41<input required name="correct_choice1" value="${accordionCount}_choice4" type="radio"> 42<input required class="w-11/12 focus:outline-none border focus:border-yellow-300" 43placeholder="選択肢4" id="${accordionCount}_choice4" name="${accordionCount}_choice4" type="text"> 44</div> 45</div> 46</div> 47</div> 48</div> 49</li> 50`; 51 52addAccordion = () => { 53 accordionCount += 1; 54 console.log(accordionCount); 55 list.insertAdjacentHTML('beforeend', html); 56}; 57 58removeAccordion = () => {}; 59

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

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

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

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

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

guest

回答2

0

ベストアンサー

なぜ、htmlにしっかりと連番が反映されないのでしょうか?

const html = ・・・の 代入が実行されるとき、その時点での変数 accordionCount の値(1)が、${accordionCount} に反映されて、右辺(= の右側)の文字列が作られますが、その出来上がった文字列には、

  • 自分、この後もaccordionCountの値をウォッチして、変更があったら自動的に${accordionCount}の部分を自動的に変更しときますわー

みたいな、気いきかしてくれる機能は無いねん。そやからずっと、最初に作ったときの${accordionCount}んとこは1のまんまや。とりま最小限の修正するとしたら、以下の2箇所やねん。

(1)変数htmlを、文字列ではなく、文字列を返す関数にする。

diff

1- const html = ` 2+ const html = () => `

(2) html を使っていたところで、関数htmlを実行し、それによって返された文字列を使うようにする。

diff

1- list.insertAdjacentHTML('beforeend', html); 2+ list.insertAdjacentHTML('beforeend', html());

投稿2021/09/12 01:49

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Patao_program

2021/09/12 01:56

そうでしたか〜!ありがとうございます!
guest

0

constだからでは?

投稿2021/09/12 01:27

m.ts10806

総合スコア80875

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問