Проблема не в детях. Когда вы запускаете свой код, вы получаете ошибку "Uncaught TypeError: Cannot set property 'innerHTML' of null"
. Глядя на ваш код, в котором вы используете .innerHTML
, мы видим, что вы пытаетесь сослаться на элемент, которого нет в этом коде:
document.getElementById("firstTest")
Теперь, после добавления этого, у вас все еще есть некоторые элементы, которые следует изменить.
asp-action
и asp-route-name
недействительны HTML. Вы используете фреймворк, который требует этого синтаксиса? - Не используйте
.getElementsByClassName()
. - Используйте
.querySelectorAll()
и Array.forEach()
на результате для упрощения цикла. - Не используйте
.innerHTML
, если вы не работаете со строками HTML, поскольку это может повлиять на безопасность и производительность сделать так. По возможности избегайте встроенных стилей. Их использование вызывает дублирование кода, и код сложнее масштабировать. Вместо этого используйте классы CSS и .classList
API.
Не совсем понятно, что именно должно происходить при нажатии ваших кнопок, но посмотрите обновленный код ниже :
function GetPostsByTopic(topic) {
var area = document.getElementById("postArea");
// Don't use .getElementsByClassName() as it provides a live node list
// and causes quite a performance hit, especially when used in loops.
// Use .querySelectorAll() and then use .forEach() on the collection that
// it returns to iterate over them.
area.querySelectorAll(".topicArea").forEach(function(area){
var topics = [];
// No need for children, here. Again, use .querySelectorAll()
area.querySelectorAll("*").forEach(function(child) {
topics.push(child.getAttribute("asp-route-name"));
document.getElementById("firstTest").textContent = child.getAttribute("asp-route-name");
});
if (topics.indexOf(topic) > -1) {
// Don't use inline styles if you can avoid it.
// Instead use pre-made classes.
area.classList.add("hidden");
}
else {
area.classList.remove("hidden");
}
});
}
/* Use CSS classes when possible instead of inline styles */
.hidden { display:none; }
<div class="topicBox">
<button class="topicButton" onclick="GetPostsByTopic('Pets')">Pets</button>
<button class="topicButton" onclick="GetPostsByTopic('Vacation')">Vacation</button>
</div>
<div id="postArea">
<div class="post" id="post1">
<div class="topicArea">
<a asp-action="Topic" asp-route-name="Pets">Pets</a>
</div>
</div>
<div class="post" id="post2">
<div class="topicArea">
<a asp-action="Topic" asp-route-name="Vacation">Vacation</a>
</div>
</div>
<div class="post" id="post3">
<div class="topicArea">
<a asp-action="Topic" asp-route-name="Pets">Pets</a>
</div>
</div>
</div>
<div id="firstTest"></div>