Heilman
@Heilman

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

JavaScriptでリスト化(olタグを使って)させるには、どうすればいいのでしょうか?

JavaScriptで入力した言葉を数字付きで出力させる方法はありますか?

現在、JavaScriptの勉強をして、
入力フォームに文字を入力して、クリックボタンを押すと、
入力した内容が出力させるようにしています。

ただ、それだけだとつまらないので、
出力した文字を順番に数字付き(olタグを使用)で表示させようとしていますが、
2つ目・3つ目を出力しても、1しか表示されません。

2つ目には2、3つ目には3を出力させる方法はありますでしょうか?
どうすればできるでしょうか?

以下、HTMLとJavaScriptのコードです。

HTML

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>テストとサンプル</title>
  <script src="style.js"></script>
</head>
<body>
  <h1>テスト</h1>
  <p>サンプル</p>
  <form>
  <input id="input" type="text">
  <input id="push" type="button" value="クリック!">
  <div id="output"></div>
</body>
</html>
  

JavaScript

push.addEventListener('click', () => {
  output.innerHTML += `<ol><li></li></ol>${input.value}`;
});

以下、その結果です。
test-sample.png

青森県を「2.」と表示させるには、どうすればいいでしょうか?
もちろん、青森県以降の文字を入力したら、「3」・「4」と
リスト化させる形で文字とセットで入力順に数字を表示させたいですが、
どれだけやっても答えが出ません。

何か方法はありますでしょうか?

0

3Answer

今のコードは空のリストをただ繰り返し追加するだけのコードになっています.開発者ツールで出力がどうなっているか確認してみると良いと思います.

セキュリティ上の理由からinnerHTMLを直接操作することは避けてください!

https://developer.mozilla.org/ja/docs/Web/API/Element/innerHTML

いちばん確実なのは,ol要素を変数に保持しておいて,liタグをappendChildしていく方法です.

//valueやolElementは適切に取得すること
const liItem = document.createElement('li')
liItem.textContent=value

olElement.appendChild(liItem)
4Like

let number = 1とか適当に変数を設けて、イベントリスナーの中で加算(number++)したものをinputの値と共に返してあげると良いと思います。

0Like

Comments

  1. テキストコンソールなら別にそれで構わないんですが,HTMLですのでセマンティクスのことは少し頭に入れて置いていただけると幸いです.

1つ目の(number++)案や

2つ目の
const liItem = document.createElement('li')
liItem.textContent=value

olElement.appendChild(liItem)

もやりましたが、こんがらがってきました。
2つ目の件ですが、もし見ていたらで結構ですが、
下で私が書いたコードの中の、どこに書けばいいでしょうか?

push.addEventListener('click', () => {
output.innerHTML += <ol><li></li></ol>${input.value};
});

0Like

Comments

  1. とりあえずinnerHTMLを書き換える行は消してください.

    まずHTMLにolリストをベタ書きする方法については大丈夫でしょうか(結果となる状態を具体的に把握出来ているかという確認です).その動作をJavascriptで再現するという感じでコーディングしてみましょう.

    ボタンをクリックしたらコードのどの部分がどのように動作するのかとか,プログラムの流れを把握出来ていないことには,応用もままなりませんので.
    不明点を1つずつ詳細に言語化するところからはじめてください.

  2. 自分がJavaScriptを触りだした頃に分からないことが多くて「少しのできた!」が達成感につながって楽しくなった経験があります。
    そのため、あまり情報過多になっても楽しくないかもと早計して簡素な回答になってしまい失礼いたしました。

    以下にコード(CodePen)を記述しましたのでご参考になりますと幸いです。

    See the Pen qiita_ques_20240208 by benjuwan (@benjuwan) on CodePen.

    もとのHTMLコードは以下の部分を変更しております。

    - <div id="output"></div>
    + <ol id="output" style="list-style:none"></ol>
    

    JavaScriptコードでは、insertAdjacentHTMLを使用しております。

    // 上記 CodePen に書いている内容の一部は中略
    
    let listNum = 1; // #output 要素にインラインで記述した style="list-style:none" を取れば listNum は不要。
    push.addEventListener('click',()=>{
      if(entry.value.length > 0) {
       // #output 要素にインラインで記述した style="list-style:none" を取れば ${listNum}: と listNum++; の記述は不要。 
       output.insertAdjacentHTML('beforeend',`<li>${listNum}${entry.value}</li>`);
       listNum++;
      } else {
        alert('入力してください')
      }
    });
    

    @Verclene さんのおっしゃるとおり、innerHTML はユーザー入力の操作などでセキュリティリスクが生じる可能性があるため、ドキュメントにもあるようにinsertAdjacentHTMLの使用を勧めています。

  3. @benjuwan さん
    質問者様のコードで数字が増えない原因は、ol(オーダーリスト)を利用しようとしているのに、正しくli要素を追加できていないことにあります。
    ですので、変数を用意してカウントアップさせずとも、そのままli要素を追加してあげるだけでいいのかなと思いました。

    また、insertAdjacentHTMLinnerHTMLと同様にリスクあるので使用を避けた方がいいです。

    【例】外部へのリンクを持つ要素が追加できてしまう
    xss.gif

    @Verclene さんのソースを参考に以下のようにしてあげるとリスクを回避することができます。

    - output.insertAdjacentHTML('beforeend',`<li>${listNum}${entry.value}</li>`);
    
    + const liItem = document.createElement('li')
    + liItem.textContent=entry.value
    + output.appendChild(liItem)
    

    xss2.gif

    ソースコード

  4. @YottyPG さん!
    先日に引き続き、ありがとうございます。

    また、insertAdjacentHTMLもinnerHTMLと同様にリスクあるので使用を避けた方がいいです。
    【例】外部へのリンクを持つ要素が追加できてしまう

    上記についても知識不足で恥ずかしい限りでした。ご指摘ありがとうございました。

  5. ただの補足説明ですが、勉強中であるならなおさらinnerHTMLを書き換えることでHTML要素を追加変更削除するのは「今ではやってはいけない古い方法」くらいに思っておいた方がいいです。
    最新のブラウザでもこの方法が使えるのは「この方法がポピュラーだった20世紀ごろに書かれたサイトが表示されなくなるのは困るから仕方なく対応してる」という理由です。
    (例外としてある要素の中身をすべて消去したい場合にelement.innerHTML = '';と書くのは、セキュリティ的なリスクはない上に他の方法より高速でお手軽なので今でもよく使われてます)

    そんなわけで勉強しているテキストなどでinnerHTMLやinsertAdjacentHTMLを使っていたら、というかjavascriptのコードで<li>などの要素を文字列として追加するようなやり方になっていたら、それは(間違っているわけではないけど)情報が古すぎるのでそのテキストで勉強するのは避けたほうがいいです。

  6. @albireo さん
    補足説明いただきありがとうございます。

    innerHTMLやinsertAdjacentHTMLを使っていたら、というかjavascriptのコードで

    などの要素を文字列として追加するようなやり方になっていたら、それは(間違っているわけではないけど)情報が古すぎる……

    上記の部分について調べたのですが中々希望する情報(現在主流のやり方?)を見つけること叶わず、恐れ入りますが宜しければ後学のために現在主流のやり方をお教えいただいてもよろしいでしょうか?

  7. 今どきスタイルは @Verclene さんの最初の回答のようにcreateElementappendChildを使っていく形です。
    たとえば「javascript入門 appendChild」で検索するといろいろ見つかるんじゃないかと思います。

  8. @albireo さん
    お忙しい中ご回答いただきありがとうございました! 勉強になりました。

Your answer might help someone💌