Вот одна из возможных очисток:
* *
function myFunction(title) {
var results = [...document.getElementsByClassName("results")]
results.forEach(function(r) {
if (title.dataset.for == r.id) {
r.style.display = "block";
} else {
r.style.display = "none";
}
});
var titles = [...document.getElementsByClassName("title")]
titles.forEach(function(t) {
if (t == title) {
t.style.backgroundColor = "#005FAA"
} else {
t.style.backgroundColor = "lightgrey"
}
});
}
1004
<div class="container">
<div id="title1" data-for="results1" class="title" onclick="myFunction(this)">
<h4>Item 1</h4>
</div>
<div id="title2" data-for="results2" class="title" onclick="myFunction(this)">
<h4>Item 2</h4>
</div>
<div id="title3" data-for="results3" class="title" onclick="myFunction(this)">
<h4>Item 3</h4>
</div>
</div>
<div class="results" id="results1" style="display:none;">Item 1</div>
<div class="results" id="results2" style="display:none">Item 2</div>
<div class="results" id="results3" style="display:none">Item 3</div>
1006 1008
Я заменил свои три функции с одной функцией, которая принимает параметр, представляющий элемент заголовка.В обработчике событий мы просто передаем this
этой функции.Тогда в функции, мы перебираем вещи, которые, возможно, придется изменить (title
и results
узлы) тестирования, как мы делаем ли мы работаем с элементом согласования или другим и выбирают поведение на основе этого.
1014 * для того, чтобы связать
title
элементы с
results
один, я добавляю
data-for
к нему атрибут.Есть много других способов, это может быть сделано, в том числе с использованием регулярных выражений, чтобы найти базовый идентификатор (
title2 ~> 2
results2 ~> 2
, например) и соответствия на них.Но это должно заставить вас идти. 1021 * Существует более очистки, я бы, вероятно, сделать на этом, но это должно предложить значительное упрощение. 1023 * Update 1025 * Комментарий указал, что выше не позволяет общей закладке отмене выбора.Учитывая это, кажется, лучше реорганизовать немного больше и использовать подход с идентификатором общей базы.Вот еще одна версия, написанная таким образом:
function myFunction(title) {
var id = title.id.match(/^\D*(\d+)$/)[1]
var hidden = document.getElementById(`results${id}`).style.display !== 'block';
[...document.getElementsByClassName("results")].forEach(function(r) {
r.style.display = "none";
});
[...document.getElementsByClassName("title")].forEach(function(t) {
t.style.backgroundColor = "lightgrey";
});
if (hidden) {
document.getElementById(`results${id}`).style.display = 'block';
document.getElementById(`title${id}`).style.backgroundColor = '#005FAA';
}
}
body{
margin: 10px;}
.title{
background-color:lightgrey;
width: 32%;
float: left;
text-align: center;
text-decoration:none;
color:white;
margin-right: 2%;
padding: 30px;
box-sizing: border-box;
}
.title:last-child{
margin-right:0px;
width:32%;}
.results{
background-color:#005FAA;
float:left;
width: 100%;
color: white;
padding: 30px;
box-sizing: border-box;
}
<div class="container">
<div id="title1" class="title" onclick="myFunction(this)">
<h4>Item 1</h4>
</div>
<div id="title2" class="title" onclick="myFunction(this)">
<h4>Item 2</h4>
</div>
<div id="title3" class="title" onclick="myFunction(this)">
<h4>Item 3</h4>
</div>
</div>
<div class="results" id="results1" style="display:none;">Item 1</div>
<div class="results" id="results2" style="display:none">Item 2</div>
<div class="results" id="results3" style="display:none">Item 3</div>