Отображение HTML количества элементов - PullRequest
0 голосов
/ 04 августа 2020

Я делаю проекты Free Code Camp с пользовательскими историями, требующими минимального количества различных элементов.

Мне пришла в голову идея использовать часть страницы для отображения количества элементов, и я подумал, что это будет прост в реализации. Знаменитые последние слова, которые я знаю.

Потратил несколько часов на изучение MDN, W3, W3Schools, ... примеров и документации. Также искал здесь.

Я пробовал использовать botj javascript и jQuery и могу получить результаты в javascript, но они неверны. Элемент jQuery вообще не работает.


<head>
        <script src= 
            "https://code.jquery.com/jquery-2.2.4.min.js"> 
        </script>

        <script src=
        "https://code.jquery.com/jquery-3.5.0.js">
        </script>
  
</head>

<body>

<!-- much deletia -->

        <div class="ToC">
            <div>
                <table>
                    <tr>
                        <th colspan="2">HTML Element Use</th>
                    </tr>
                    <tr>
                        <td>Name</td><td>Count</td>
                    </tr>
                    <tr>
                        <td>Total</td><td><script>document.write(HTMLCollection.length)</script></td>
                    </tr>
                    <tr>
                        <td>p</td><td><script>document.write(document.getElementsByTagName('p').length);</script></td>
                    </tr>
                    <tr>
                        <td>div</td><td><script>document.write($( div ).length;)</script></td>
                    </tr>
                </table>
            </div>
        </div>

<!-- even more deletia -->

</body>

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Это получает все элементы из простого document.querySelectorAll('*'), которое соответствует всему. Вызов, который возвращает NodeList, поэтому вы хотите превратить его в массив , используя Array.from(...).

В следующей строке используется метод Array reduce для преобразования этот массив из множества элементов в единую карту. Он делает это, используя узел tagName в качестве ключа на карте и назначая узел этому ключу. На самом деле он должен сначала создать массив в элементе карты, чтобы он мог поместить sh все похожие узлы в этот массив. Это делается с помощью имени типа элемента, например DIV, в качестве ключа на карте. Если тип узла виден впервые, он создает массив, а затем во всех случаях помещает элемент в массив.

let allelements = Array.from(document.querySelectorAll('*'));

let result = allelements.reduce(function(map, obj) {
  if (map[obj.tagName] == null) {
    map[obj.tagName] = [];
  }
  map[obj.tagName].push(obj);
  return map;
}, {});
console.log(result);
<div id="div-one">
  <p>one</p>
  <p>two</p>
</div>
<div id="div-two">
  <p>three</p>
  <p>four</p>
  <p>five</p>
</div>

Затем вы можете перебирать ключи карты, чтобы узнать, сколько существует элементов каждого типа. Если все, что вас волнует, это общее количество элементов, вы можете пропустить уменьшение массива и просто использовать allelements.length, который сообщает вам, сколько всего узлов было выбрано.

Обратите внимание, что это получает ВСЕ элементы! Вы можете ограничить его только элементами <body>, сначала выбрав тело, а затем используя querySelectorAll на , что .

В этом примере я также добавил суммирование количества каждого типа элемента на консоль.

let body = document.querySelector('body');

let allelements = Array.from(body.querySelectorAll('*'));

let result = allelements.reduce(function(map, obj) {
  if (map[obj.tagName] == null) {
    map[obj.tagName] = [];
  }
  map[obj.tagName].push(obj);
  return map;
}, {});

console.log('Resulting map =', result);

console.log('Counts:');
for (tag of Object.keys(result)) {
 console.log(tag.toLowerCase(), result[tag].length);
}
<div id="div-one">
  <p>one</p>
  <p>two</p>
</div>
<div id="div-two">
  <p>three</p>
  <p>four</p>
  <p>five</p>
</div>
0 голосов
/ 04 августа 2020

var divCnt = document.getElementsByTagName('div').length
var pCnt = document.getElementsByTagName('p').length
var tCnt = document.getElementsByTagName('*').length

document.getElementById('total').innerHTML = tCnt;

document.getElementById('div').textContent = divCnt;
document.getElementById('p').innerHTML = pCnt;
<head>
        <script src= 
            "https://code.jquery.com/jquery-2.2.4.min.js"> 
        </script>

        <script src=
        "https://code.jquery.com/jquery-3.5.0.js">
        </script>
  
</head>

<body>

<!-- much deletia -->

        <div class="ToC">
            <div>
                <table>
                    <tr>
                        <th colspan="2">HTML Element Use</th>
                    </tr>
                    <tr>
                        <td>Name</td><td>Count</td>
                    </tr>
                    <tr>
                        <td>Total</td><td id='total'></td>
                    </tr>
                    <tr>
                        <td>p</td><td id='p'></td>
                    </tr>
                    <tr>
                        <td>div</td><td id='div'></td>
                    </tr>
                </table>
            </div>
        </div>

<!-- even more deletia -->

</body>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...