Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Оптимизировать код (https://javascript.ru/forum/misc/83149-optimizirovat-kod.html)

Ubivectel 01.10.2021 05:22

Оптимизировать код
 
Привет мир!

Имеется конструкция скрывающая модальные окна и их оверлей. Вот такая:

let scolor = document.querySelector('#scolor');
    scolor.onclick = function () {
        document.querySelectorAll('#KIDE_opciones, .overlayo').forEach(elem => elem.style.display = "none");
      
    };

    let most = document.querySelector('.overlayo');
    most.onclick = function () {
        document.querySelectorAll('.KIDE_mostrar, .overlayo').forEach(elem => elem.style.display = "none");
    };

    let kidemens = document.querySelector('#kide_x_s');
    kidemens.onclick = function () {
        document.querySelector(".overlayo").style.display = "none";
    };

    let kborrar = document.querySelector('#KIDE_mensaje_borrar');
    kborrar.onclick = function () {
        document.querySelector(".overlayo").style.display = "none";
    };


Все работает, но перфекционизм негодует, 4 переменные для одной и той же функции наверное дико, попытался записать в одну добавив цикл:

let scolor = document.querySelectorall('#scolor, .overlayo, #kide_x_s, #KIDE_mensaje_borrar').forEach(el) =>;
    scolor.onclick = function () {
        document.querySelectorAll('#KIDE_opciones, .overlayo, .KIDE_mostrar, ').forEach(elem => elem.style.display = "none");
    };


Явно блуждаю в синтаксисе, но уже по всякому перепробовал. Можно ли заставить это работать?

рони 01.10.2021 07:16

Ubivectel,
если окна однотипные, должно быть примерно так.
let modal = document.querySelectorAll('.modal');
let btn = document.querySelectorAll('.btn');
btn.forEach((el, i) => el.addEventListener('click', () => modal[i].style.display = "none"));

Ubivectel 01.10.2021 07:52

Привет рони :victory:

Нет, не прокатывает, там в том и заморочка, что кругом разные селекторы '.modal' и '.btn' не присутствуют на нужных элементах. А дописывать им классы чревато тем, что они "подхватят/" лишние стили

рони 01.10.2021 08:32

Ubivectel,
впишите ваши селекторы в предложенный код или сделайте минимальный макет

Ubivectel 19.10.2021 14:32

Однако весь моск поломал, но этот код работает:

let scolor = document.querySelector('#scolor');
    scolor.onclick = function() {
        document.querySelectorAll('#KIDE_opciones, .overlayo').forEach(elem => elem.style.display = "none");
        
    };

    let most = document.querySelector('.overlayo');
    most.onclick = function() {
        document.querySelectorAll('.KIDE_mostrar, .overlayo').forEach(elem => elem.style.display = "none");
        
    };

    let kidemens = document.querySelector('#kide_x_s');
    kidemens.onclick = function() {
        document.querySelector(".overlayo").style.display = "none";
    };

    let kborrar = document.querySelector('#KIDE_mensaje_borrar');
    kborrar.onclick = function() {
        document.querySelector(".overlayo").style.display = "none";
    };


А этот нет:

let scolor = document.querySelectorall('#scolor, .overlayo, #kide_x_s, #KIDE_mensaje_borrar').forEach(el) =>;
        scolor.onclick = function () {
            document.querySelectorAll('#KIDE_opciones, .overlayo, .KIDE_mostrar,').forEach(elem => elem.style.display = "none");
        };


Вроде ведь одно и то же, что не так делаю :(

Ubivectel 19.10.2021 15:02

И так не работает

let modals = document.querySelectorAll('#scolor, .overlayo, #kide_x_s, #KIDE_mensaje_borrar');
    let btns = document.querySelectorAll('#KIDE_opciones, .overlayo, .KIDE_mostrar,');
    btns.forEach((el, i) => el.addEventListener('click', () => modals[i].style.display = "none"));

ksa 19.10.2021 15:06

Цитата:

Сообщение от Ubivectel
что не так делаю

Дык писали тебе выше...
Цитата:

Сообщение от рони
сделайте минимальный маке


Ubivectel 19.10.2021 15:09

Да я не дорос до таких слов )

рони 19.10.2021 15:15

Ubivectel,

[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

voraa 19.10.2021 16:26

Так наверно должно быть
document.querySelectorall('#scolor, .overlayo, #kide_x_s, #KIDE_mensaje_borrar')
  .forEach( el =>  {
        el.onclick =  () => el.style.display = "none"
       }
   )


Часовой пояс GMT +3, время: 16:58.