Thao tác DOM với JavaScript

DOM (Document Object Model) là cách JavaScript tương tác với HTML và CSS. Hiểu DOM là bước đầu để làm web interactive!

1. Selecting Elements

Các cách để chọn elements trong DOM:

// getElementById
const header = document.getElementById('header');

// getElementsByClassName - trả về HTMLCollection
const buttons = document.getElementsByClassName('btn');

// getElementsByTagName
const paragraphs = document.getElementsByTagName('p');

// querySelector - lấy phần tử đầu tiên
const firstButton = document.querySelector('.btn');
const mainDiv = document.querySelector('#main');

// querySelectorAll - lấy tất cả, trả về NodeList
const allButtons = document.querySelectorAll('.btn');
const inputs = document.querySelectorAll('input[type="text"]');

// Với querySelectorAll, có thể dùng forEach
allButtons.forEach(button => {
    console.log(button);
});

2. Manipulating Content

Thay đổi nội dung của elements:

const element = document.querySelector('#myDiv');

// textContent - chỉ text, không parse HTML
element.textContent = 'Hello World';

// innerHTML - parse HTML
element.innerHTML = '<strong>Bold Text</strong>';

// innerText - giống textContent nhưng tôn trọng CSS styling
element.innerText = 'Visible Text';

// Lấy giá trị input
const input = document.querySelector('#username');
const value = input.value;
input.value = 'New Value';

3. Modifying Attributes

Thay đổi attributes của elements:

const link = document.querySelector('a');

// getAttribute / setAttribute
const href = link.getAttribute('href');
link.setAttribute('href', 'https://example.com');

// Trực tiếp
link.href = 'https://example.com';
link.target = '_blank';

// Data attributes
const div = document.querySelector('#myDiv');
div.dataset.userId = '123';
div.dataset.userName = 'Huy';

// Access: <div data-user-id="123" data-user-name="Huy">
console.log(div.dataset.userId); // '123'

// Class manipulation
const element = document.querySelector('.box');
element.classList.add('active');
element.classList.remove('hidden');
element.classList.toggle('highlight');
element.classList.contains('active'); // true/false

// Replace class
element.classList.replace('old-class', 'new-class');

4. Styling Elements

Thay đổi CSS styles:

const box = document.querySelector('.box');

// Inline styles
box.style.color = 'red';
box.style.backgroundColor = 'blue';
box.style.fontSize = '20px';
box.style.display = 'none';

// Multiple styles
Object.assign(box.style, {
    color: 'white',
    backgroundColor: 'black',
    padding: '20px',
    borderRadius: '10px'
});

// Get computed styles
const styles = window.getComputedStyle(box);
console.log(styles.color);
console.log(styles.fontSize);

5. Creating and Adding Elements

Tạo và thêm elements mới:

// createElement
const newDiv = document.createElement('div');
newDiv.textContent = 'New Element';
newDiv.classList.add('box');

// Thêm vào DOM
const container = document.querySelector('#container');
container.appendChild(newDiv); // Thêm vào cuối
container.prepend(newDiv); // Thêm vào đầu

// insertBefore
const reference = document.querySelector('.existing');
container.insertBefore(newDiv, reference);

// insertAdjacentHTML
element.insertAdjacentHTML('beforebegin', '<p>Before</p>');
element.insertAdjacentHTML('afterbegin', '<p>Start</p>');
element.insertAdjacentHTML('beforeend', '<p>End</p>');
element.insertAdjacentHTML('afterend', '<p>After</p>');

// Clone element
const clone = newDiv.cloneNode(true); // true = deep clone

6. Removing Elements

Xóa elements khỏi DOM:

const element = document.querySelector('.to-remove');

// Modern way
element.remove();

// Old way
element.parentNode.removeChild(element);

// Remove all children
const parent = document.querySelector('#parent');
parent.innerHTML = '';

// Or
while (parent.firstChild) {
    parent.removeChild(parent.firstChild);
}

7. Event Handling

Lắng nghe và xử lý events:

const button = document.querySelector('#myButton');

// addEventListener
button.addEventListener('click', function(e) {
    console.log('Button clicked!');
    console.log(e.target); // Element được click
});

// Arrow function
button.addEventListener('click', (e) => {
    e.preventDefault(); // Ngăn hành động mặc định
    console.log('Clicked!');
});

// Remove event listener
function handleClick() {
    console.log('Clicked');
}
button.addEventListener('click', handleClick);
button.removeEventListener('click', handleClick);

// Event delegation
document.querySelector('#list').addEventListener('click', (e) => {
    if (e.target.tagName === 'LI') {
        console.log('List item clicked:', e.target.textContent);
    }
});

// Common events
element.addEventListener('mouseenter', handler);
element.addEventListener('mouseleave', handler);
input.addEventListener('input', handler);
input.addEventListener('change', handler);
form.addEventListener('submit', handler);
window.addEventListener('scroll', handler);
window.addEventListener('resize', handler);

8. Traversing the DOM

Di chuyển qua DOM tree:

const element = document.querySelector('.current');

// Parent
const parent = element.parentElement;
const parentNode = element.parentNode;

// Children
const children = element.children; // HTMLCollection
const firstChild = element.firstElementChild;
const lastChild = element.lastElementChild;

// Siblings
const nextSibling = element.nextElementSibling;
const prevSibling = element.previousElementSibling;

// Find closest parent matching selector
const card = element.closest('.card');

// Check if element matches selector
element.matches('.active'); // true/false

9. Practical Example

Ví dụ thực tế - Todo List:

// HTML: <input id="todoInput"> <button id="addBtn">Add</button> <ul id="todoList"></ul>

const input = document.querySelector('#todoInput');
const addBtn = document.querySelector('#addBtn');
const list = document.querySelector('#todoList');

addBtn.addEventListener('click', () => {
    const text = input.value.trim();
    if (!text) return;
    
    // Tạo li element
    const li = document.createElement('li');
    li.textContent = text;
    
    // Tạo delete button
    const deleteBtn = document.createElement('button');
    deleteBtn.textContent = 'Delete';
    deleteBtn.addEventListener('click', () => {
        li.remove();
    });
    
    // Thêm vào DOM
    li.appendChild(deleteBtn);
    list.appendChild(li);
    
    // Clear input
    input.value = '';
});

Kết luận

DOM manipulation là kỹ năng cốt lõi trong JavaScript:

Thực hành nhiều với các project nhỏ để thành thạo!