Nur jewails ein <details> open mit JS

Nur jewails ein <details> open mit JS

Um sicherzustellen, dass immer nur ein <details>-Element geöffnet ist, wenn der Benutzer ein anderes <details>-Element anklickt, kannst du ein JavaScript hinzufügen, das alle anderen <details>-Elemente schließt, sobald eines geöffnet wird.

Hier ist ein Beispiel:

HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Details Toggle</title>
<style>
details {
margin-bottom: 10px;
}
</style>
</head>
<body>
<details>
<summary>Item 1</summary>
<p>Details for Item 1</p>
</details>
<details>
<summary>Item 2</summary>
<p>Details for Item 2</p>
</details>
<details>
<summary>Item 3</summary>
<p>Details for Item 3</p>
</details>

<script src="script.js"></script>
</body>
</html>

JavaScript

document.addEventListener('DOMContentLoaded', () => {
// Alle <details>-Elemente holen
const detailsElements = document.querySelectorAll('details');

detailsElements.forEach((details) => {
details.addEventListener('toggle', () => {
if (details.open) {
// Alle anderen Details-Elemente schließen
detailsElements.forEach((otherDetails) => {
if (otherDetails !== details) {
otherDetails.open = false;
}
});
}
});
});
});

Erklärung

  1. Event Listener hinzufügen:
    • Jedes <details>-Element bekommt einen toggle-Event-Listener.
    • Der toggle-Event wird ausgelöst, wenn ein <details>-Element geöffnet oder geschlossen wird.
  2. Prüfen, ob open ist:
    • Wenn ein <details>-Element geöffnet wird (d.h. details.open === true), schließen wir alle anderen <details>-Elemente.
  3. Alle anderen schließen:
    • Ein forEach-Loop iteriert über alle <details>-Elemente und schließt diejenigen, die nicht gerade geöffnet wurden.

Ergebnis

  1. Öffnest du ein <details>-Element, schließen sich alle anderen automatisch.
  2. Du kannst beliebig viele <details>-Elemente im HTML verwenden, und das Skript funktioniert ohne zusätzliche Anpassungen.

Probiere es aus! 😊