DOM Manipulation in JavaScript

DOM manipulation

The DOM (Document Object Model) DOM manipulation is a programming interface that represents web documents as a tree structure of objects. JavaScript can interact with this tree to dynamically manipulate HTML content, styles, and structure.

1. Accessing Elements

Basic Selectors:

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

// By class name (returns HTMLCollection)
const items = document.getElementsByClassName('item');

// By tag name (returns HTMLCollection)
const paragraphs = document.getElementsByTagName('p');

// Modern selectors (returns NodeList)
const element = document.querySelector('#container .item');
const allElements = document.querySelectorAll('.items');

2. Manipulating Content

Text Content:

// Safe text manipulation
element.textContent = 'New text content';

// HTML content (beware of XSS vulnerabilities)
element.innerHTML = '<strong>Bold text</strong>';

Attributes:

// Get/set attributes
element.setAttribute('data-id', '123');
const id = element.getAttribute('data-id');

// Toggle boolean attributes
checkbox.checked = true;

Styles:

// Inline styles
element.style.color = 'red';
element.style.backgroundColor = '#fff';

// CSS Classes
element.classList.add('active');
element.classList.remove('inactive');
element.classList.toggle('hidden');

3. Creating Elements

// Create new element
const newDiv = document.createElement('div');

// Add content and attributes
newDiv.textContent = 'New element';
newDiv.className = 'box';

// Append to DOM
document.body.appendChild(newDiv);

// Insert before existing element
parent.insertBefore(newDiv, existingElement);

// Remove elements
parent.removeChild(elementToRemove);

4. Event Handling

// Basic event listener
button.addEventListener('click', function(e) {
  console.log('Button clicked!', e.target);
});

// Event delegation
document.addEventListener('click', function(e) {
  if(e.target.matches('.delete-btn')) {
    e.target.parentElement.remove();
  }
});

5. DOM Traversal

// Parent/child navigation
const parent = element.parentNode;
const children = element.childNodes;

// First/last child
const firstChild = parent.firstElementChild;
const lastChild = parent.lastElementChild;

// Sibling navigation
const nextSibling = element.nextElementSibling;
const prevSibling = element.previousElementSibling;

6. Performance Tips

  1. Batch DOM Updates
    Use document fragments for multiple updates:
   const fragment = document.createDocumentFragment();
   for(let i = 0; i < 100; i++) {
     const div = document.createElement('div');
     fragment.appendChild(div);
   }
   document.body.appendChild(fragment);
  1. Debounce Scroll/Resize Events
   window.addEventListener('resize', debounce(handleResize, 200));

   function debounce(fn, delay) {
     let timeout;
     return function() {
       clearTimeout(timeout);
       timeout = setTimeout(fn, delay);
     };
   }
  1. Avoid Forced Synchronous Layouts
   // Bad - multiple layout triggers
   element.style.width = '100px';
   const width = element.offsetWidth;
   element.style.height = width + 'px';

   // Good - batch style changes
   element.style.cssText = 'width:100px; height:100px;';

7. Modern DOM APIs

Mutation Observer:

const observer = new MutationObserver(mutations => {
  mutations.forEach(mutation => {
    console.log('DOM changed:', mutation);
  });
});

observer.observe(targetElement, {
  attributes: true,
  childList: true,
  subtree: true
});

Element Dimensions:

// Get element dimensions
const rect = element.getBoundingClientRect();
console.log(rect.width, rect.height);

// Viewport-relative position
console.log(rect.top, rect.left);

Key Concepts:

  1. DOM Tree: Hierarchical representation of HTML elements
  2. Nodes: All elements, text, comments are nodes
  3. Live Collections: getElementsBy* methods return live collections
  4. Virtual DOM: Optimization technique used by frameworks like React

Remember:

  • DOM manipulation is relatively slow – minimize direct DOM operations
  • Prefer CSS classes over inline styles for complex styling
  • Use event delegation for dynamic elements
  • Always sanitize user input before using innerHTML

This comprehensive understanding of DOM manipulation will help you create dynamic, interactive web applications efficiently.

Helpful Resources

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *