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"
       }
   )

ksa 19.10.2021 16:43

Цитата:

Сообщение от voraa
Так наверно должно быть

У Ubivectel там разные селекторы... ;)

Цитата:

Сообщение от Ubivectel
#scolor, .overlayo, #kide_x_s, #KIDE_mensaje_borrar

...
#KIDE_opciones, .overlayo, .KIDE_mostrar


ksa 19.10.2021 16:48

Цитата:

Сообщение от Ubivectel
Вроде ведь одно и то же, что не так делаю

Нет. Не одно и то же. :no:
У тебя всякий раз разный набор селекторов
#scolor -> #KIDE_opciones, .overlayo
.overlayo -> .KIDE_mostrar, .overlayo
#kide_x_s, #KIDE_mensaje_borrar -> .overlayo

ksa 19.10.2021 17:02

Автор не дает нам шанс проверить... :(
Предложу такой вариант.
let scolor = document.querySelectorAll('#scolor, .overlayo, #kide_x_s, #KIDE_mensaje_borrar').forEach(el => {
	const a = ['.overlayo']
	if (el.id === 'scolor') a.push('#KIDE_opciones')
	if (el.classList.contains('overlayo')) a.push('.KIDE_mostrar')
	const val = a.join(', ')
	el.onclick = function () {
		document.querySelectorAll(val).forEach(elem => elem.style.display = "none");
	};
})

Ubivectel 19.10.2021 17:07

Тоже не срабатывает, постараюсь более внятно выложить фрагменты кода, это не так просто, поскольку это разные модальные окна и их код раскидан по разнам файлам. Так-то сейчас работает все, но не могу в себе подавить бунт перфекционизма )))))

Ubivectel 19.10.2021 17:10

Проверить тут: https://noviy-kovcheg.ru/chat этот код закрывает модальные окна "цвет" и при правом клике на ник в окне сообщений

Ubivectel 19.10.2021 17:13

Цитата:

Сообщение от ksa (Сообщение 540807)
Автор не дает нам шанс проверить... :(
Предложу такой вариант.
let scolor = document.querySelectorAll('#scolor, .overlayo, #kide_x_s, #KIDE_mensaje_borrar').forEach(el => {
	const a = ['.overlayo']
	if (el.id === 'scolor') a.push('#KIDE_opciones')
	if (el.classList.contains('overlayo')) a.push('.KIDE_mostrar')
	const val = a.join(', ')
	el.onclick = function () {
		document.querySelectorAll(val).forEach(elem => elem.style.display = "none");
	};
})

Ураааа! Заработало! Всем спасибо товарищи, пошел "курить" как именно все работает. :dance:


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