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

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

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

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

Q&A

0回答

953閲覧

目次の自動生成JSについて教えてください

totiki

総合スコア5

JavaScript

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

0グッド

0クリップ

投稿2021/03/31 03:09

編集2021/03/31 03:44

下記サイトを参考に目次の自動生成を実装しているのですが、
https://www.marorika.com/entry/create-toc

h4も取得して出力できるようにしたいのですが、

<ul>タグが入れ子にならずに出力されてしまい困ってます。

↓このようにh4も入れ子で出力するにはどのような記述にすればよいのか教えてください。

<ul>  <li>   <ul>    <li>h3見出し      <ul>       <li>h4見出し/li>      </ul>    </li>   </ul>  </li> </ul>

↓実際のソース
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

<!-- 目次を作成する先 --> <div id="toc"></div> <script type="text/javascript"> document.addEventListener('DOMContentLoaded', function () { var contentsList = document.getElementById('toc'); // 目次を追加する先(table of contents) var div = document.createElement('div'); // 作成する目次のコンテナ要素 // .entry-content配下のh2、h3要素を全て取得する var matches = document.querySelectorAll('.entry-content h2, .entry-content h3, .entry-content h4'); // 取得した見出しタグ要素の数だけ以下の操作を繰り返す matches.forEach(function (value, i) { // 見出しタグ要素のidを取得し空の場合は内容をidにする var id = value.id; if(id === '') { id = value.textContent; value.id = id; } // 要素がh2タグの場合 if(value.tagName === 'H2') { var ul = document.createElement('ul'); var li = document.createElement('li'); var a = document.createElement('a'); // 追加する<ul><li><a>タイトル</a></li></ul>を準備する a.innerHTML = value.textContent; a.href = '#' + value.id; li.appendChild(a) ul.appendChild(li); // コンテナ要素である<div>の中に要素を追加する div.appendChild(ul); } // 要素がh3タグの場合 if(value.tagName === 'H3') { var ul = document.createElement('ul'); var li = document.createElement('li'); var a = document.createElement('a'); // コンテナ要素である<div>の中から最後の<li>を取得する。 var lastUl = div.lastElementChild; var lastLi = lastUl.lastElementChild; // 追加する<ul><li><a>タイトル</a></li></ul>を準備する a.innerHTML = value.textContent; a.href = '#' + value.id; li.appendChild(a) ul.appendChild(li); // 最後の<li>の中に要素を追加する lastLi.appendChild(ul); } // 要素がh4タグの場合 if(value.tagName === 'H4') { var ul = document.createElement('ul'); var li = document.createElement('li'); var a = document.createElement('a'); // コンテナ要素である<div>の中から最後の<li>を取得する。 var lastUl = div.lastElementChild; var lastLi = lastUl.lastElementChild; // 追加する<ul><li><a>タイトル</a></li></ul>を準備する a.innerHTML = value.textContent; a.href = '#' + value.id; li.appendChild(a) ul.appendChild(li); // 最後の<li>の中に要素を追加する lastLi.appendChild(ul); } }); // 最後に画面にレンダリング contentsList.appendChild(div); }); </script>

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

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

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

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

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

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

miyabi_takatsuk

2021/03/31 03:17

> このようにh4も入れ子で出力するにはどのような記述にすればよいのか教えてください。 この時点で、思いっきりHTMLの文法違反になっているので、 そのライブラリを使用して、そのような構造になるなら、そもそもそのライブラリの使用をやめた方がよいかと。
totiki

2021/03/31 03:46

ご指摘ありがとうございます。そもそもの文法が間違っているのですね。 初心者のため、他に手軽に実装できそうな目次JSの方法がありましたら教えていただけると有難いです。
yambejp

2021/03/31 04:52

なにから何を導きたいのかきちんと説明したほうがよいです
miyabi_takatsuk

2021/03/31 06:39

> 他に手軽に実装できそうな目次JSの方法 「ブログ記事 目次 JavaScript」で調べると、多数散見されるので、 ご自身で、理想のものを探されるとよいかと。 yambejpさんのおっしゃる通り、要件をもっと詳細にしていただかないと、 第三者が言えることは正直無いかと。
totiki

2021/03/31 06:43

JS初心者で何をどのように質問すればよいのか、詳細に説明できずにすみません。 いろいろ調べてみて、また分からないカ所が明確になったら、また質問投稿したいと思います。
miyabi_takatsuk

2021/03/31 06:51

同じ内容の質問なのであれば、 新規投稿せず、この質問で、解決アクションなりしましょう。 解決した際には、自己解決の投稿、もしくは、回答がついたなら、 BAを選出して、質問を閉じられるとよいかと。 回答つかないけど、解決してないなら、質問を編集したりして、回答を待つか、自身で調査を続けるか、をしていくとよいかと。 とかく、同じ内容で新規投稿をすると、teratailでは特に毛嫌いされますし、 このサイトのヘルプでも、推奨されておりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問