Zum Inhalt springen

JavaScript DOM-Manipulationstechniken

DOM-Manipulation (Document Object Model) ist ein kritischer Aspekt der Webentwicklung, der es Ihnen ermöglicht, dynamische und interaktive Webseiten zu erstellen. Dieser Leitfaden behandelt Best Practices, Techniken zur Leistungsoptimierung und Methoden zum Klonen von Knoten, damit Sie das DOM effizient manipulieren können.

Best Practices für die DOM-Manipulation

Direkten DOM-Zugriff minimieren

Der Zugriff auf das DOM kann langsam sein, da er dazu führen kann, dass der Browser das Layout neu berechnet und die Elemente neu zeichnet. Um den direkten DOM-Zugriff zu minimieren:

  • Fassen Sie DOM-Updates zusammen, anstatt mehrere kleine Updates durchzuführen.
  • Verwenden Sie Variablen, um Referenzen auf häufig zugriffene Elemente zu speichern.

Ereignisbehandlung optimieren

Hängen Sie Event-Handler effizient an:

  • Verwenden Sie Event Delegation, um die Anzahl der Event-Listener zu reduzieren.
  • Vermeiden Sie das direkte Anhängen zu vieler Event-Listener an Elemente.

Nicht mehr benötigte Elemente bereinigen

Entfernen Sie Elemente, die nicht mehr benötigt werden, um Speicher freizugeben und die Leistung zu verbessern:

  • Verwenden Sie die Methoden removeChild oder remove, um Elemente aus dem DOM zu löschen.

Minimieren von Reflows und Repaints

Was sind Reflows und Repaints?

  • Reflows treten auf, wenn sich das Layout eines Seitenbereichs ändert, wodurch der Browser die Positionen und Größen von Elementen neu berechnen muss.
  • Repaints erfolgen, wenn sich das visuelle Erscheinungsbild von Elementen ändert, ohne das Layout zu beeinflussen (z. B. Farbänderungen).

Techniken zum Minimieren von Reflows und Repaints

Änderungen bündeln

Fassen Sie mehrere Änderungen zusammen, um wiederholte Reflows und Repaints zu vermeiden:


html
<!DOCTYPE html>
<html>
<head>
    <title>Batching Changes</title>
</head>
<body>
    <div id="content">Original Content</div>
    <button id="update">Update Content</button>

    <script>
        document.getElementById('update').addEventListener('click', () => {
            const content = document.getElementById('content');
            content.style.display = 'none'; // Hide element to batch changes
            content.innerHTML = 'Updated Content';
            content.style.display = 'block'; // Show element after updates
        });
    </script>
</body>
</html>

Dieses Beispiel zeigt, wie Änderungen an einem DOM-Element gebündelt werden können, um Reflows und Repaints zu minimieren. Indem Sie das Element vor mehreren Updates ausblenden und danach wieder einblenden, können Sie Zwischen-Reflows und Repaints vermeiden.

CSS-Klassen für Änderungen verwenden

Wenden Sie CSS-Änderungen über Klassen an, anstatt Stile direkt zu manipulieren:


html
<!DOCTYPE html>
<html>
<head>
    <title>Use CSS Classes</title>
    <style>
        .hidden { display: none; }
        .highlight { color: red; font-weight: bold; }
    </style>
</head>
<body>
    <div id="content">Hello World</div>
    <button id="toggle">Toggle Highlight</button>

    <script>
        document.getElementById('toggle').addEventListener('click', () => {
            const content = document.getElementById('content');
            content.classList.toggle('highlight');
        });
    </script>
</body>
</html>

Dieses Beispiel zeigt, wie CSS-Klassen verwendet werden können, um mehrere Stiländerungen auf einmal anzuwenden, was effizienter ist als das Ändern einzelner Stil-Eigenschaften. Das Umschalten einer Klasse, die mehrere Stile ändert, hilft, die Anzahl der Reflows und Repaints zu reduzieren.

Verwendung von Document Fragments für die Leistung

Was ist ein Document Fragment?

Ein Document Fragment ist ein leichtgewichtiger Container, der zum Halten einer Gruppe von Knoten verwendet wird. Es ist nicht Teil des Haupt-DOM-Baums, was bedeutet, dass Änderungen daran keine Reflows und Repaints auslösen.

INFO

Führen Sie bei mehreren DOM-Manipulationen DocumentFragment ein, um Ihre Änderungen zu bündeln und sie in einem einzigen Vorgang an das DOM anzuhängen. Dieser Ansatz minimiert Reflows und Repaints und verbessert die Leistung erheblich.

Beispiel zur Verwendung von Document Fragments


html
<!DOCTYPE html>
<html>
<head>
    <title>Document Fragments</title>
</head>
<body>
    <div id="list"></div>
    <button id="populate">Populate List</button>

    <script>
        document.getElementById('populate').addEventListener('click', (event) => {
            const fragment = document.createDocumentFragment();
            for (let i = 1; i <= 25; i++) {
                const item = document.createElement('div');
                item.textContent = `Item ${i}`;
                fragment.appendChild(item);
            }
            document.getElementById('list').appendChild(fragment);
            event.target.disabled = true; // Disable the button
        });
    </script>
</body>
</html>

Dieses Beispiel erstellt 25 div-Elemente und hängt sie an ein Document Fragment an. Erst nachdem alle Elemente zum Fragment hinzugefügt wurden, wird das Fragment in einem einzigen Vorgang an das DOM angehängt. Dieser Ansatz minimiert Reflows und Repaints, indem das DOM nur einmal aktualisiert wird.

Klonen von Knoten

Die cloneNode()-Methode

Die Methode cloneNode() wird verwendet, um eine Kopie eines Knotens zu erstellen. Sie kann den Knoten selbst oder den Knoten zusammen mit seinen Kindern klonen.

Einen Knoten ohne Kinder klonen


html
<!DOCTYPE html>
<html>
<head>
    <title>Cloning Nodes</title>
</head>
<body>
    <div id="original">Original Node</div>
    <button id="clone">Clone Node</button>

    <script>
        document.getElementById('clone').addEventListener('click', () => {
            const original = document.getElementById('original');
            const clone = original.cloneNode(false); // Clone without children
            clone.id = 'clone';
            clone.textContent = 'Cloned Node';
            document.body.appendChild(clone);
        });
    </script>
</body>
</html>

Dieses Beispiel zeigt, wie ein Knoten ohne seine Kinder mit der Methode cloneNode(false) geklont wird. Der geklonte Knoten kopiert die Attribute und den Textinhalt des ursprünglichen Knotens, nicht jedoch seine untergeordneten Knoten.

Einen Knoten mit Kindern klonen


html
<!DOCTYPE html>
<html>
<head>
    <title>Cloning Nodes with Children</title>
</head>
<body>
    <div id="original">
        Original Node
        <span>Child Node</span>
    </div>
    <button id="clone">Clone Node with Children</button>

    <script>
        document.getElementById('clone').addEventListener('click', () => {
            const original = document.getElementById('original');
            const clone = original.cloneNode(true); // Clone with children
            clone.id = 'clone';
            document.body.appendChild(clone);
        });
    </script>
</body>
</html>

Dieses Beispiel zeigt, wie ein Knoten zusammen mit seinen Kindern mit der Methode cloneNode(true) geklont wird. Der geklonte Knoten enthält den Inhalt des ursprünglichen Knotens und alle seine untergeordneten Knoten.

Fazit

Eine effiziente DOM-Manipulation ist entscheidend für die Erstellung leistungsstarker Webanwendungen. Durch das Befolgen von Best Practices, das Minimieren von Reflows und Repaints, die Verwendung von Document Fragments und das effektive Klonen von Knoten können Sie Ihre Webseiten für eine bessere Leistung und Responsiveness optimieren.

Praxis

Welche der folgenden Methoden werden zur DOM-Manipulation in JavaScript verwendet?

Finden Sie das nützlich?

Dual-run-Vorschau — vergleichen Sie mit den Symfony-Routen live.