Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
4 / 4 / 5
Регистрация: 01.11.2021
Сообщений: 211

Изменить свойства одного элемента по клику

17.07.2024, 12:21. Показов 539. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

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

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
let ul = document.createElement('ul');
  ul.className = "list";
  body.append(ul);
 
  for (let i = 0; i < countCard; i++) {
    let li = document.createElement('li');
    li.className = "list__card";
    ul.append(li);
 
    let h2 = document.createElement('h2');
    h2.className = "list__card__header ";
    h2.textContent = arr[i];
    li.append(h2);
 
    const clickCard = document.querySelector("li");
    clickCard.addEventListener("click", (event) => {
      clickCard.className = "list__card--rotate";
      h2.className = "list__card__header--rotate";
    });
  };
Это позволяет изменить стили, но только у самого первого элемента. И нажимается соответственно тоже только первый элемент. Что я должен изменить, чтобы можно было кликнуть любой из элементов?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.07.2024, 12:21
Ответы с готовыми решениями:

Не могу найти инфу: как изменить свойства одного элемента при наведении на другой?
К примеру наводим курсор на один элемент, а применить свойство возможно на другой, причем применить свойство не к дочернему блоку вовсе...

Изменить background элемента по клику.
Ребята, имеется такой вот код &lt;div class=&quot;container&quot;&gt; &lt;div class=&quot;container-slider&quot; id=&quot;containerSlider&quot;&gt; ...

Изменить цвет элемента по клику на другом элементе
Нужно чтобы при нажатии на элемент id=&quot;orange&quot; элемент id=&quot;shar&quot; менял цвет &lt;html&gt; &lt;meta charset=&quot;utf-8&quot; /&gt; &lt;link...

8
1 / 1 / 0
Регистрация: 07.01.2015
Сообщений: 92
17.07.2024, 13:11
Добрый день. Дело в том, что document.querySelector берёт первый попавшийся элемент, если у вас имеется несколько подходящих под условие элементов на странице, в данном случае элементов с тегом li. И так как вы делаете это в цикле, то подозреваю, что на первый элемент вашего списка было навешено несколько обработчиков клика. Можете проверить мою догадку через console.log на 17 строке.

Вы могли бы использовать document.querySelectorAll, который соберёт коллекцию имеющихся элементов li на странице, по которой можно будет пройти циклом и повесить обработчики на каждый элемент, но:
1. у вас получится цикл в цикле, а это плохая практика;
2. не решена проблема закрепления нескольких обработчиков за одним и тем же элементом, только теперь на каждый элемент будет вешаться по несколько обработчиков

Вместо этого предлагаю совсем отказаться от каких-либо способов поиска элементов li на странице, ведь вы уже сохранили искомый элемент li в let li(советую изменить на const, а имя поменять на ту же clickCard), а значит по этому же имени можно обращаться напрямую к элементу. Если не заморачиваться на нейминге и зря использованной переменной, то достаточно стереть всё на 15 строке, а вместо clickCard ниже по коду использовать li - этим вы решите все проблемы)

Ещё немного побубню: советую коллбэк, передаваемый вторым аргументом в addEventListener, сохранить куда-то отдельно в константу - вдруг вам понадобится потом снять обработчик. С анонимной функцией это будет затруднительно. Но для этого придётся немного унифицировать сам коллбэк)
0
 Аватар для voraa
1255 / 1194 / 179
Регистрация: 21.01.2024
Сообщений: 5,504
17.07.2024, 13:35
Делегировать событие клика

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
let ul = document.createElement('ul');
  ul.className = "list";
  body.append(ul);
 
  for (let i = 0; i < countCard; i++) {
    let li = document.createElement('li');
    li.className = "list__card";
    ul.append(li);
 
    let h2 = document.createElement('h2');
    h2.className = "list__card__header ";
    h2.textContent = arr[i];
    li.append(h2);
  };
  
  ul.addEventListener("click", (event) => {
    const li = event.target.closest('li');
    if (li) {
        const h2 = li.querySelector('h2');
        li.className = "list__card--rotate";
        h2.className = "list__card__header--rotate";
    }
  });
2
4 / 4 / 5
Регистрация: 01.11.2021
Сообщений: 211
17.07.2024, 14:17  [ТС]
voraa, спасибо. Получилось.
И еще спрошу. Как можно посчитать количество кликов? Кликнули один элемент, затем второй и т.д. Если кликов задангое количество, то возвращаем классы по умолчанию
0
1 / 1 / 0
Регистрация: 07.01.2015
Сообщений: 92
17.07.2024, 14:19
Понял, вам не разобраться нужно, а готовое)
0
4 / 4 / 5
Регистрация: 01.11.2021
Сообщений: 211
18.07.2024, 08:32  [ТС]
Zubbol, нет, не готовое.
Нужна только помощь.


На данный момент вот что получилось у меня

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 let a = 0; // счетчик кликов
  ul.addEventListener("click", (event) => {
    const li = event.target.closest('li');
    if (li) {
      a = a + 1;
      console.log(a);
      const h2 = li.querySelector('h2');
      if (a < 3) {
        li.className = "list__card__rotate";
        h2.className = "list__card__header__rotate";
      } else {
        const allCard = document.querySelectorAll('li');
        const allCardHeader = document.querySelectorAll('h2');
        allCard.forEach(list__card__rotate => {
          list__card__rotate.className = 'list__card';
        });
        allCardHeader.forEach(list__card__header__rotate => {
          list__card__header__rotate.className = 'list__card__header';
        });
        a = 0;
      }
    }
  });
Правда счетчик срабатывает и при повторном нажатии на элемент. А лучше бы исключить это
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3827 / 1664 / 429
Регистрация: 14.03.2022
Сообщений: 4,192
18.07.2024, 08:56
Цитата Сообщение от ne_Proger Посмотреть сообщение
Правда счетчик срабатывает и при повторном нажатии на элемент. А лучше бы исключить это
Так ты проверяй выбран элемент или нет... Если выбран - ничего не делай.
0
 Аватар для voraa
1255 / 1194 / 179
Регистрация: 21.01.2024
Сообщений: 5,504
18.07.2024, 09:18
Лучший ответ Сообщение было отмечено ne_Proger как решение

Решение

Что такое можно
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const maxSelCard = 3;
ul.addEventListener("click", (event) => {
    const li = event.target.closest('li');
    if (li) {
        const selCard = document.querySelectorAll('ul>li.list__card__rotate');
        console.log(selCard.length);
        if (selCard.length < maxSelCard) {
            li.className = "list__card__rotate";
            const h2 = li.querySelector('h2');
            h2.className = "list__card__header__rotate";
        } else {
            selCard.forEach(card => {
                card.className = 'list__card';
                card.querySelector('h2').className = 'list__card__header';
            });
        }
        }
});
Как то с классами странно. Зачем надо классы list__card и list__card__rotate. Проще ведь использовать list__card, а для выбранных добавлять класс rotate и убирать его когда не нужен, чем переустанавливать все классы.
1
4 / 4 / 5
Регистрация: 01.11.2021
Сообщений: 211
18.07.2024, 09:48  [ТС]
Цитата Сообщение от voraa Посмотреть сообщение
Как то с классами странно. Зачем надо классы list__card и list__card__rotate. Проще ведь использовать list__card, а для выбранных добавлять класс rotate и убирать его когда не нужен, чем переустанавливать все классы.
Я художник, я так вижу )))
Для меня JS остается не очень то и понятным. Потому пока делаю так, как лично для меня понятнее. Позже я уже понял, что можно просто пару свойств в классе менять, чем переопределять весь класс. Как добью этот кусок, так и поправлю уже эту мелочь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.07.2024, 09:48
Помогаю со студенческими работами здесь

Как из одного ViewController изменить свойства другого?
Здравствуйте! У меня приложение на UITabBarController, я хочу чтобы если пользователь нажал кнопку в 1 вью, во втором отобразилась...

Изменить свойства одного контролла событием другого
Есть 2 пользовательских контрола class Timeline : Control {} class Bar : Control {} Затем в коде формы создаются по одному...

Появление элемента по клику на кнопку и скрытие элемента по клику на любое место body
Задача стоит такая. Нужно сделать так, чтобы по клику на button class=&quot;helper&quot; наш div id = &quot;helper_list&quot; появлялся на экране(по...

Изменить блочные свойства элемента
&lt;form class=&quot;form&quot;&gt; &lt;div class=&quot;login&quot;&gt;Логин: &lt;input type=&quot;text&quot; name=&quot;LoginName&quot; class=&quot;Login_Area&quot; /&gt;&lt;/div&gt; &lt;/form&gt; .login{...

Как изменить через JS color одного элемента HTML если id второго элемента сейчас в URL?
Доброго времени суток! Подскажите ,пожалуйста, код JS с помощью которого можно изменить color одного элемента HTML если id второго...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru