Как кликать на вложенные элементы так, чтобы не кликался родительский элемент?

Ссылка скопирована
1 ответ

Например мне нужно кликать на Subsummary 1 чтобы открывался Subdropdown content 1, а не закрывался Summary 1:

Как кликать на вложенные элементы так, чтобы не кликался родительский элемент?

Как кликать на вложенные элементы так, чтобы не кликался родительский элемент?

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Accordion Summary Example</title> <style>     .data-accordion--summary-container {         margin-bottom: 10px;         padding: 10px;         background-color: lightblue;         cursor: pointer;     }     .dropdown {         display: none;         background-color: lightcoral;         padding: 10px;     } </style> </head> <body>  <div class="data-accordion--summary-container">     Summary 1     <div class="dropdown">         Dropdown content 1         <div class="data-accordion--summary-container">             Subsummary 1             <div class="dropdown">                 Subdropdown content 1             </div>         </div>                 <div class="data-accordion--summary-container">             Subsummary 2             <div class="dropdown">                 Subdropdown content 2             </div>         </div>     </div> </div>  <div class="data-accordion--summary-container">     Summary 2     <div class="dropdown">         Dropdown content 2     </div> </div>  <div class="data-accordion--summary-container">     Summary 3     <div class="dropdown">         Dropdown content 3     </div> </div>  <script> // Function to find the closest ancestor with class "data-accordion--summary-container" function findClosestSummaryContainer(element) {     while (element) {         if (element.classList.contains('data-accordion--summary-container')) {             return element;         }         element = element.parentElement;     }     return null; }  // Attach click event listener to the document body document.body.addEventListener('click', function(event) {     // Find the closest ancestor with class "data-accordion--summary-container"     var summaryContainer = findClosestSummaryContainer(event.target);     if (summaryContainer) {         // Toggle the visibility of the dropdown associated with this container         var dropdown = summaryContainer.querySelector('.dropdown');         if (dropdown) {             // Hide dropdowns of other containers             document.querySelectorAll('.dropdown').forEach(function(otherDropdown) {                 if (otherDropdown !== dropdown) {                     otherDropdown.style.display = 'none';                 }             });             // Toggle the visibility of this container's dropdown             dropdown.style.display = (dropdown.style.display === 'block') ? 'none' : 'block';         }     } }); </script>  </body> </html>

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Accordion Summary Example</title> <style> .data-accordion--summary-container { margin-bottom: 10px; padding: 10px; background-color: lightblue; cursor: pointer; } .dropdown { display: none; background-color: lightcoral; padding: 10px; } </style> </head> <body> <div class="data-accordion--summary-container"> Summary 1 <div class="dropdown"> Dropdown content 1 <div class="data-accordion--summary-container"> Subsummary 1 <div class="dropdown"> Subdropdown content 1 </div> </div> <div class="data-accordion--summary-container"> Subsummary 2 <div class="dropdown"> Subdropdown content 2 </div> </div> </div> </div> <div class="data-accordion--summary-container"> Summary 2 <div class="dropdown"> Dropdown content 2 </div> </div> <div class="data-accordion--summary-container"> Summary 3 <div class="dropdown"> Dropdown content 3 </div> </div> <script> // Function to find the closest ancestor with class "data-accordion--summary-container" function findClosestSummaryContainer(element) { while (element) { if (element.classList.contains('data-accordion--summary-container')) { return element; } element = element.parentElement; } return null; } // Attach click event listener to the document body document.body.addEventListener('click', function(event) { // Find the closest ancestor with class "data-accordion--summary-container" var summaryContainer = findClosestSummaryContainer(event.target); if (summaryContainer) { // Toggle the visibility of the dropdown associated with this container var dropdown = summaryContainer.querySelector('.dropdown'); if (dropdown) { // Hide dropdowns of other containers document.querySelectorAll('.dropdown').forEach(function(otherDropdown) { if (otherDropdown !== dropdown) { otherDropdown.style.display = 'none'; } }); // Toggle the visibility of this container's dropdown dropdown.style.display = (dropdown.style.display === 'block') ? 'none' : 'block'; } } }); </script> </body> </html>

Дополнительно:

html структуру просто поменять достаточно.
Summary оборачиваешь в кнопку и уже на неё вешаешь открытие/закрытие. Аналогично с Subsummary.

Ответы:

1. https://developer.mozilla.org/en-US/docs/Web/API/E...
2. https://developer.mozilla.org/en-US/docs/Web/API/E...

хотя… там код c другой логикой:
snippet

.dropdown.show {   display: block; }

.dropdown.show { display: block; }

const accordionItemSelector = '.data-accordion--summary-container'; const contentSelector = '.dropdown'; const activeClass = 'show';  document.body.addEventListener('click', ({ target: t }) => {   if (t.matches(accordionItemSelector)) {     document.querySelectorAll(contentSelector).forEach(n => {       if (!n.contains(t) && !t.contains(n)) {         n.classList.remove(activeClass);       };     });      t.querySelector(contentSelector).classList.toggle(activeClass);   } });

const accordionItemSelector = '.data-accordion--summary-container'; const contentSelector = '.dropdown'; const activeClass = 'show'; document.body.addEventListener('click', ({ target: t }) => { if (t.matches(accordionItemSelector)) { document.querySelectorAll(contentSelector).forEach(n => { if (!n.contains(t) && !t.contains(n)) { n.classList.remove(activeClass); }; }); t.querySelector(contentSelector).classList.toggle(activeClass); } });

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Ольга Сеть Ответ

Для того чтобы кликать на вложенные элементы без того, чтобы кликался родительский элемент, можно использовать метод, который называется "event.stopPropagation()". Этот метод останавливает дальнейшее распространение события по DOM, что позволяет избежать срабатывания события на родительском элементе.

Пример использования этого метода в JavaScript:

const parentElement = document.getElementById('parentElement');
const childElement = document.getElementById('childElement');
 
childElement.addEventListener('click', function(event) {
  event.stopPropagation();
  // Здесь можно добавить код, который будет выполняться при клике на дочерний элемент
});

const parentElement = document.getElementById('parentElement'); const childElement = document.getElementById('childElement'); childElement.addEventListener('click', function(event) { event.stopPropagation(); // Здесь можно добавить код, который будет выполняться при клике на дочерний элемент });

В данном примере, при клике на дочерний элемент "childElement", событие не будет распространяться на родительский элемент "parentElement", и клик на дочернем элементе будет обработан независимо от родительского элемента.

Таким образом, используя метод "event.stopPropagation()", можно предотвратить нежелательное срабатывание событий на родительском элементе при клике на вложенные элементы.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно