Các phần nâng cao trong DOM

27-08-24 Admin
-

Khi bạn đã thành thạo các phần cơ bản của DOM Manipulation, bạn có thể khám phá các khía cạnh nâng cao để tạo ra các ứng dụng web mạnh mẽ và tối ưu hơn. Dưới đây là một số chủ đề nâng cao trong DOM Manipulation:

1. Sự kiện Delegation

Sự kiện Delegation là một kỹ thuật tối ưu để xử lý sự kiện cho nhiều phần tử con mà không cần phải gán sự kiện cho từng phần tử riêng lẻ.

  • Ví dụ: Thay vì gán sự kiện click cho mỗi nút trong một danh sách, bạn có thể gán sự kiện cho phần tử cha và kiểm tra xem phần tử nào được nhấp.
document.getElementById("parentElement").addEventListener("click", function(event) {
    if (event.target && event.target.nodeName == "BUTTON") {
        console.log("Button " + event.target.innerText + " clicked");
    }
});

2. Document Fragments

Document Fragments là một tập hợp các nút DOM không được gắn vào DOM chính. Điều này cho phép bạn tạo và thao tác trên các phần tử mà không ảnh hưởng đến hiệu suất hoặc gây ra quá trình tái vẽ (reflow) và tái hiện (repaint) trên trang.

  • Sử dụng Document Fragment:
var fragment = document.createDocumentFragment();
for (var i = 0; i < 100; i++) {
    var newElement = document.createElement("div");
    newElement.textContent = "Element " + i;
    fragment.appendChild(newElement);
}
document.body.appendChild(fragment);

Việc này sẽ nhanh hơn so với việc thêm từng phần tử trực tiếp vào DOM.

3. Shadow DOM

Shadow DOM là một phần của Web Components, cho phép tạo ra các cây DOM riêng biệt với các phần tử không ảnh hưởng đến các phần còn lại của tài liệu.

  • Tạo Shadow DOM:
var shadow = element.attachShadow({mode: 'open'});
shadow.innerHTML = `<style>p { color: red; }</style><p>Hello Shadow DOM!</p>`;

Shadow DOM cho phép bạn giữ style và logic tách biệt, giảm thiểu xung đột với phần còn lại của trang web.

4. Mutation Observers

Mutation Observer là một API cho phép bạn theo dõi các thay đổi trong DOM, như thêm, xóa hoặc thay đổi các thuộc tính của các phần tử.

  • Ví dụ sử dụng Mutation Observer:
var observer = new MutationObserver(function(mutations) {
    mutations.forEach(function(mutation) {
        console.log(mutation.type);
    });
});

var config = { attributes: true, childList: true, subtree: true };
observer.observe(document.body, config);

API này rất hữu ích để lắng nghe và phản ứng với các thay đổi trong DOM một cách hiệu quả.

5. Custom Elements

Custom Elements là một phần của Web Components, cho phép bạn định nghĩa các phần tử HTML tùy chỉnh.

  • Tạo Custom Element:
class MyElement extends HTMLElement {
    constructor() {
        super();
        this.attachShadow({ mode: 'open' }).innerHTML = `<p>Custom Element Content</p>`;
    }
}

customElements.define('my-element', MyElement);

Custom Elements cho phép tạo ra các phần tử có hành vi và giao diện độc đáo, tái sử dụng trong các ứng dụng.

6. Intersection Observer

Intersection Observer API cho phép bạn theo dõi khi các phần tử xuất hiện hoặc biến mất khỏi vùng nhìn thấy của người dùng, rất hữu ích cho việc lazy-loading hình ảnh hoặc nội dung.

  • Ví dụ sử dụng Intersection Observer
var observer = new IntersectionObserver(function(entries) {
    entries.forEach(function(entry) {
        if (entry.isIntersecting) {
            console.log('Element is in view:', entry.target);
            observer.unobserve(entry.target);
        }
    });
});

observer.observe(document.querySelector('#myElement'));

7. Template và Clone Node

Template là một công cụ mạnh mẽ để tạo nội dung DOM mà không hiển thị ngay lập tức. Bạn có thể sử dụng nó cùng với cloneNode() để tạo ra nhiều bản sao của một mẫu.

  • Sử dụng template và cloneNode:
<template id="myTemplate">
    <div class="item">Item</div>
</template>

<script>
    var template = document.getElementById("myTemplate");
    for (var i = 0; i < 10; i++) {
        var clone = document.importNode(template.content, true);
        clone.querySelector('.item').textContent = "Item " + i;
        document.body.appendChild(clone);
    }
</script>

8. Event Throttling và Debouncing

Khi làm việc với các sự kiện như scroll hoặc resize, điều quan trọng là phải giảm thiểu số lần sự kiện được kích hoạt để cải thiện hiệu suất. Throttling và debouncing là hai kỹ thuật phổ biến để đạt được điều này.

Throttling: Giới hạn số lần một hàm được gọi trong một khoảng thời gian cụ thể.

function throttle(func, limit) {
    let lastFunc;
    let lastRan;
    return function() {
        const context = this;
        const args = arguments;
        if (!lastRan) {
            func.apply(context, args);
            lastRan = Date.now();
        } else {
            clearTimeout(lastFunc);
            lastFunc = setTimeout(function() {
                if ((Date.now() - lastRan) >= limit) {
                    func.apply(context, args);
                    lastRan = Date.now();
                }
            }, limit - (Date.now() - lastRan));
        }
    }
}

Debouncing: Đảm bảo rằng hàm chỉ được gọi sau khi sự kiện đã dừng lại trong một khoảng thời gian nhất định.

function debounce(func, delay) {
    let timeoutId;
    return function() {
        const context = this;
        const args = arguments;
        clearTimeout(timeoutId);
        timeoutId = setTimeout(() => func.apply(context, args), delay);
    };
}

9. Async DOM Manipulation

Khi làm việc với các tác vụ bất đồng bộ, như tải dữ liệu từ server, bạn có thể muốn đảm bảo rằng DOM chỉ được cập nhật khi dữ liệu đã sẵn sàng. Sử dụng async/await giúp quản lý các thao tác DOM liên quan đến dữ liệu bất đồng bộ một cách rõ ràng hơn.

  • Ví dụ:
async function fetchDataAndUpdateDOM() {
    try {
        let response = await fetch('https://api.example.com/data');
        let data = await response.json();
        document.getElementById("content").innerText = data.content;
    } catch (error) {
        console.error("Error fetching data:", error);
    }
}

fetchDataAndUpdateDOM();

10. Performance Optimization

  • Reduce Reflows/Repaints: Tránh thay đổi DOM nhiều lần trong một thao tác. Thay vào đó, hãy cập nhật một lần sau khi đã hoàn tất mọi thay đổi.
  • Use requestAnimationFrame: Sử dụng requestAnimationFrame để đảm bảo các thay đổi DOM được thực hiện trước khi trình duyệt vẽ lại trang.
function updateUI() {
    // DOM manipulation here
}

requestAnimationFrame(updateUI);

Những kỹ thuật nâng cao này sẽ giúp bạn tối ưu hóa hiệu suất, bảo trì dễ dàng hơn, và tạo ra các ứng dụng web phức tạp và hiện đại. Nếu bạn cần thêm chi tiết hoặc ví dụ về bất kỳ chủ đề nào, hãy cho tôi biết!

Bài viết liên quan

Làm quen với VueJS

26-10-2024 Admin
42 views + likes

Nếu bạn mới bắt đầu học lập trình front-end, thì Vue.js là một gợi ý không thể bỏ qua vì cách tiếp cận và sử dụng rất dễ dàng.

Lý thuyết về Cookie & Session & Localstorage

18-10-2024 Admin
45 views + likes

Cookie thích hợp cho việc lưu trữ thông tin nhỏ và ngắn hạn, Session là lựa chọn tốt để lưu trữ thông tin bảo mật như phiên làm việc

Network request trong JS

10-10-2024 Admin
50 views + likes

Network request trong JS

Xử lý bất đồng bộ với callback, promise, và async/await trong JavaScript

27-09-2024 Admin
67 views + likes

Bất đồng bộ là một khái niệm quan trọng trong lập trình, đặc biệt là trong các ứng dụng web và xử lý tác vụ như tải dữ liệu từ máy chủ, đọc file từ hệ thống

Javascript cơ bản

13-09-2024 Admin
123 views + likes

Nhập môn javascript