.querySelector()
возвращает первый элемент, соответствующий запросу. Вам понадобится .querySelectorAll()
, чтобы получить все совпадения, а затем вам придется перебрать все найденные элементы, чтобы определить, должны ли они быть скрыты или нет. Избегайте .getElementsByClassName()
, поскольку это возвращает "список активных узлов" , который не подходит для большинства случаев использования и снижает производительность.
Возможно, вам также понадобится другой класс, который просто указывает, является ли элемент скрываемым или нет, чтобы при отображении всех элементов вы знали, какой из них будет скрыт позже.
Кроме того, по возможности избегайте встроенных стилей. Просто установите классы CSS заранее и добавьте или удалите их с помощью element.classList.add()
и element.classList.remove()
.
Наконец, используйте .innerHTML
, только когда строка, которую вы получаете / настраиваете, фактически содержит HTML, который необходимо проанализировать, и когда вы полностью контролируете эту строку. При неправильном использовании он тратит ресурсы и может открыть дыры в безопасности вашего кода. Если строка, с которой вы работаете, не содержит HTML или не нуждается в анализе синтаксическим анализатором HTML, используйте .textContent
.
Комментарии встроены ниже:
var button = document.querySelector('.toggle-button');
button.addEventListener('click', function (event) {
// Get all the hideable items into an Array so that .forEach() can be safely used to loop over them
let hiddenItems = Array.prototype.slice.call(document.querySelectorAll('.hideable'));
// Are we hiding or showing?
let showing = button.textContent === "Show more items";
// Loop over the items
hiddenItems.forEach(function(item){
if(!showing){
// If we are hiding, then add the .hidden-item class
item.classList.add("hidden-item");
} else {
// Otherwise remove the .hidden-item class
item.classList.remove("hidden-item");
}
// Update the button text:
button.textContent = button.textContent === "Show more items" ? "Hide items" : "Show more items";
});
});
/* This could be placed in an external .css file */
.hidden-item { display:none; }
<div class="item">Item 1</div>
<div class="item">Item 2</div>
<div class="item hidden-item hideable">Item 3</div>
<div class="item hidden-item hideable">Item 4</div>
<div class="item hidden-item hideable">Item 5</div>
<button class="toggle-button">Show more items</button>