Задать вопрос
@ifap

Как на чистом JS отобрать HTML элементы по определенным признакам?

Имеем такой HTML:

<input type="radio" onclick="select1()">
<input type="radio" onclick="select2()">
<input type="radio" onclick="select3()">

<div id="box">
content
	<div class="a"></div>
	<div class="a"></div>
	<div class="a"></div>

	<div class="b"></div>
	<div class="b"></div>
	<div class="b"></div>

	<div class="c"></div>
	<div class="c"></div>
	<div class="c"></div>
</div>


Задача сделать средствами чистого JS так, чтобы select1 скрывал все DIV внутри DIV#box, кроме DIV.a и присваивал им aria-hidden:true, select2 – то же самое, кроме DIV.b, select3 – то же самое, кроме DIV.c

И вот весь StacksOverflow с MDN перерыл – не выходит каменный цветок :(

Блоков много, присваивать им ID и перечислять поименно – так себе затея. Классов мало – их можно перечислить поименно при необходимости.

Есть идеи по рабочему коду?
  • Вопрос задан
  • 184 просмотра
Подписаться 1 Простой 3 комментария
Решения вопроса 1
IvanU7n
@IvanU7n
nothing interesting here
0. причём здесь MSDN?
1. DIV.box не существует в указанной разметке, но существует div#box
2. для каждой радиокнопки (которая не обязательно должна быть именно радиокнопкой) делается свой вариант onclick="select('div#box', 'div.a')"
3. select() пишется элементарно:
function select(where, what) {
  for (const node of document.querySelectorAll(`${where} > :not(${what})`)) {
    node.setAttribute('aria-hidden', 'true');
    // то, что подразумевается под "скрывал"
  }
  for (const node of document.querySelectorAll(`${where} > ${what}`)) {
    node.removeAttribute('aria-hidden');
    // обратное тому, что подразумевается под "скрывал"
  }
}

4. если разметка такая, то всё теоретически можно сделать и на CSS без JS, но это уже другая история

после переименования select() в selectOne() всё работает — написанные строкой через атрибуты обработчики ЕМНИП имеют сам элемент как ближайший resolving-scope — тело как бы обёрнуто в with (this) { ... }, а у <input> есть свой select():
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
Примерно так можно:
- при клике передавать имя класса, и всего один общий обработчик
- перечислить все классы, чтобы выбранный включать, а остальные выключать
Ответ написан
Комментировать
Tishaa
@Tishaa
и так же для остальных select
let a = document.querySelector('.a');
    let b = document.querySelector('.b');
    let c = document.querySelector('.c');
    function select1(){
        b.style.display = "none"
        c.style.display = "none"
        b.setAttribute("aria-hidden", "true")
        c.setAttribute("aria-hidden", "true")
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы