プログラマー VTuber 衣亥栖ティオのちょっとした話

Youtubeに投稿したプログラミング学習動画の補足説明をするためのブログです。

プログラマーへの道 #36 の補足説明

こんにちは、プログラマーVTuberの衣亥栖ティオです。
今回は以下の動画の補足説明をします。 動画内で実装したソースコードも載せています。


今回の動画で実装したソースコード

以下が今回実装したソースコードです。

HTMLの改行

innerHTML は HTML をセットできるプロパティなので、HTMLタグがそのまま画面に反映されます。 HTMLで改行する場合は "
" を利用します。

<br>: 改行要素 - HTML: HyperText Markup Language | MDN

登録済みタイトルの取得について

動画内では "同じタイトルは登録することができない" という仕様を実装するために、 まずは "すべてのメモのタイトルを取得する" という処理を実装しようとしていました。

そのときに利用したのが childNodes です。 childNodes は子要素を保持しているプロパティです。

Node.childNodes - Web API | MDN

動画内では以下のような実装でした。 id-memo-list という id が振られているメモ一覧の子要素を取得しています。 メモ一覧の子要素は行(trタグ)です。

const tmp = document.getElementById("id-memo-list")
if (tmp.childNodes.length > 0) {
  const trs = tmp.childNodes
  trs.forEach((tr) => {
    console.log(tr)
  })
}

しかし、この実装はうまく動きませんでした。 childNodes は子要素が1件もない状態でもテキストが子要素としてセットされているからです。 私はこの仕様を知りませんでした。

【JavaScript】childNodesで空白のtext(#text)を削除して要素のみ取得する | Web活

代わりに children を利用することでうまくいきそうです。 以下の記事にも "Element.children は要素のノードしか含みません。すべての子ノード、例えばテキストやコメントノードなどを取得するには、 Node.childNodes を使用してください。" との記載があるので、 childNodes を利用するとうまく行かないことが分かると思います(テキストはコメントノードを除外する処理をすればchildNodesでもうまくいきますが、少し面倒ですよね)。

Element.children - Web API | MDN