Проблема здесь в том, что document.getElementsByTagName("li")
возвращает live NodeList. См. MDN .
Живой NodeList будет обновляться при добавлении в документ дополнительных элементов li
. В этом случае, когда элементы пагинации li
добавляются в документ, они скрываются вместе со всеми другими элементами, отсутствующими на текущей странице. При нажатии кнопки нумерации страниц.
Чтобы продемонстрировать это, я покажу ваш код (Аннотации мои) :
let StudentListItem = document.getElementsByTagName('li'); // a live list
console.log(StudentListItem.length); // <-- 54 in your GitHub example
// ...
// Now create the pagination buttons:
for (let i = 0; i < TotalPages; i+= 1) {
pageli = document.createElement('li'); // <-- Here we create a new li in the document
const pageLink = document.createElement('a');
pageLink.className = 'active';
pageLink.href = '#';
pageLink.textContent = i + 1;
pageli.appendChild(pageLink);
buttonUl.appendChild(pageli);
// ...
// add the event listener
} // End of loop for each pagination button
Так что теперь, если вы проверите StudentListItem
, вы обнаружите, что теперь он содержит больше элементов. (Это список live , помните)
console.log(StudentListItem.length); // <-- now 60 (54 original plus 6 from the pagination links)
Решение:
Решение состоит в том, чтобы не иметь StudentListItem
быть списком live для всех элементов li
в document
.
Я думал о трех возможных решениях:
Не получить все пунктов списка, ограничить его только оригинальным ul
.
Например:
let ul = document.getElementsByTagName("ul");
let StudentListItem = ul.getElementsByTagName("li");
Теперь это все еще живой список, но нумерация страниц li
не является дочерними для ul
, который мы выбираем.
Не используйте live список.
let StudentListItem = document.querySelectorAll("li");
Здесь document.querySelectorAll
возвращает статический список, который не будет обновляться при добавлении новых элементов li
в document
.
Просто используйте заранее рассчитанную длину при скрытии предметов. (NumberofItem
)
Так что вместо
for (let i = 0; i < StudentListItem.length; i++) {
// Hide items...
сделать
for (let i = 0; i < NumberofItem; i++) {
Это ограничивает количество скрытых li
элементов только оригинальными.
Еще одна вещь, которую я заметил, это то, что слушатель событий был прикреплен к контейнеру вокруг кнопок разбиения на страницы, а не к самим кнопкам. Это можно исправить, заменив
buttonDiv.addEventListener('click', (event) => {
с
pageli.addEventListener('click', (event) => {
Причина, по которой кнопки отображаются на первой странице, заключается в том, что они не были скрыты, чтобы скрыться при вызове первой функции showPage()
. Причина, по которой кнопки отображаются на странице 6 th , заключается в том, что они представляют собой элементы 55-60 th li
, которые попадают в элементы 6 th стр.