LoginSignup
0
0

More than 3 years have passed since last update.

年末まで毎日webサイトを作り続ける大学生 〜50日目 再帰的関数を用い、特定のタグの数を調べるシステムを作る〜

Last updated at Posted at 2019-12-07

はじめに

こんにちは!@70days_jsです。

再帰的関数の書き方を勉強しました。
タグ名を入力すると、ページ内にあるそのタグの数を自動で調べてくれます。

今日は50日目。(2019/12/7)
よろしくお願いします。

サイトURL

やったこと

動作としてはこんな感じです。↓
test3.gif

ページを開くとプロンプトが出るので、そこでタグ名を入力します。
入力したタグ名を持つタグの個数をDOMから自動で調べてくれます。

まず、htmlに適当にタグを書いていきます。↓

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <script src="day50.js" defer></script>
    <title>day50</title>
  </head>
  <body>
    <h1>タグ数検索システム</h1>
    <div>
      <p></p>
      <div>
        <p></p>
        <div><p></p></div>
        <div></div>
      </div>
    </div>
  </body>
</html>

今回はhtmlはなんでもいいです。
強いて言うならば、以下の部分を気をつけましょう。

<script src="day50.js" defer></script>

JavaScriptを読み込んでいるscriptタグですが、deferをつけています。
これをつけることで、htmlの読み込みが完了した後にJavaScriptを実行するようにしています。
今回はDOMを読み込んでタグを数えていくので、deferがあるのとないのとでは大きな違いになります。

JavaScript全文↓

let element = prompt("調べたいタグを入力してください ex: div");
element = element.toUpperCase();
console.log(element);
let wantToCheckNode = [];

//第一引数にdocument(DOM調査の開始場所)、第二引数に数を調べたいタグ名
function checkNodeTree(node, element) {
  for (var i = 0; i < node.childNodes.length; i++) {
    if (node.childNodes[i].nodeType === 1) {
      if (node.childNodes[i].tagName === element) {
        wantToCheckNode.push(node.childNodes[i]);
      }
      checkNodeTree(node.childNodes[i], element);
    }
  }
}

checkNodeTree(document, element);
console.log(wantToCheckNode);
document.body.innerHTML +=
  element + "タグの数は" + wantToCheckNode.length + "個です。";

promptで調べたいタグ名をユーザーから取得します。
toUpperCase()を使い、タグ名を大文字にします。
これは要素のタグ名をtagNameで調べた時に、返ってくる値が大文字の状態だからです。

そして今回の主題である再帰はここです。↓

function checkNodeTree(node, element) {
for(var i=0;...){
if(){if(){}
checkNodeTree(node.childNodes[i], element);
}}}

関数checkNodeTree()の中で、自分自身であるcheckNodeTree()を呼び出しています。
内側にある関数は引数にiを使っていますね。
こうすることで微妙に値が変わっていくので、DOMツリーの全てを調べられます。

他ポイントとしては、
for文とchildNodesの組み合わせで子要素を全て調べられるとか、
nodetypeで要素のタイプが判別できたりとか(ちなみにELEMENTノードは1)です。

感想

再帰はうまく使えばかなり便利なものなんじゃないかと思いました。
今回は自分で作ったページ内のタグを調べるだけでしたが、これをベースに改良していけば、他サイトの分析を自分のやりたいようにできるなーとか思いました。
とにかく再帰、すごい。

最後まで読んでいただきありがとうございます。明日も投稿しますのでよろしくお願いします。

参考

1.Node.nodeType - ノードの種類を表す整数 | DOM

参考にさせていただきました!ありがとうございます!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0