Logo
Published on

DOM Generation

How DOM Generation Improves Code Quality

Understanding DOM generation with template literals enables developers to create dynamic HTML without verbose createElement calls. This technique reduces complexity while improving readability, making it essential for modern JavaScript development. Teams using template literals report cleaner component code and faster UI updates.

TL;DR

  • Build HTML strings with template literals
  • DOM Generation works seamlessly with innerHTML
  • Reduces createElement boilerplate dramatically
  • Perfect for dynamic lists and component rendering
const result = process(data)

The DOM Generation Challenge

You're reviewing code that creates product cards dynamically. The current implementation uses verbose createElement and appendChild calls that make the HTML structure hard to visualize. Each new element requires multiple lines of imperative code.

// The problematic approach with createElement
const product = { name: 'Laptop', price: 999, rating: 4.5 }
function oldCreateCard(data) {
  const div = document.createElement('div')
  const h3 = document.createElement('h3')
  h3.textContent = data.name
  div.appendChild(h3)
  return div
}
console.log('Old way:', oldCreateCard(product))

Modern DOM generation with template literals creates cleaner, more readable HTML:

// The elegant solution with template literals
const product = { name: 'Laptop', price: 999, rating: 4.5 }
function newCreateCard(data) {
  const html = `<div class="card">
        <h3>${data.name}</h3>
        <p>$${data.price}</p>
    </div>`
  console.log('Generating card HTML')
  console.log('Template literal used:', true)
  return html
}
console.log('Final output:', newCreateCard(product))

Best Practises

Use DOM generation when:

  • ✅ Creating dynamic lists from API data
  • ✅ Building reusable component templates
  • ✅ Generating forms with variable fields
  • ✅ Rendering data tables and grids

Avoid when:

  • 🚩 User input goes directly into innerHTML (XSS risk)
  • 🚩 Need fine-grained DOM updates (use frameworks)
  • 🚩 Complex event handling is required
  • 🚩 Virtual DOM would be more efficient

System Design Trade-offs

AspectTemplate LiteralscreateElement API
ReadabilityExcellent - HTML structure visiblePoor - imperative steps
PerformanceFast - single innerHTMLSlower - multiple DOM calls
SecurityRisk - needs escapingSafe - auto-escapes text
FlexibilityHigh - any HTML structureLimited - verbose nesting
Event HandlersSeparate attachmentDirect addEventListener
Browser SupportES6+ requiredAll browsers

More Code Examples

❌ createElement verbosity
// Traditional DOM creation with createElement
function createProductList(products) {
  if (!products) {
    throw new Error('Products required')
  }
  const container = document.createElement('div')
  container.className = 'product-list'
  for (let i = 0; i < products.length; i++) {
    const product = products[i]
    const card = document.createElement('div')
    card.className = 'product-card'
    const title = document.createElement('h3')
    title.textContent = product.name
    card.appendChild(title)
    const price = document.createElement('p')
    price.textContent = '$' + product.price
    card.appendChild(price)
    const rating = document.createElement('div')
    rating.className = 'rating'
    for (let j = 0; j < 5; j++) {
      const star = document.createElement('span')
      star.textContent = j < product.rating ? '★' : '☆'
      rating.appendChild(star)
    }
    card.appendChild(rating)
    container.appendChild(card)
  }
  console.log('Building product list')
  const result = {
    element: container,
    count: products.length,
    timestamp: Date.now(),
  }
  console.log('Traditional DOM created')
  return result
}
// Test the traditional approach
const products = [
  { name: 'Laptop', price: 999, rating: 4 },
  { name: 'Phone', price: 699, rating: 5 },
]
const traditionalList = createProductList(products)
console.log('Created', traditionalList.count, 'cards')
✅ Template literal clarity
// Modern DOM generation with template literals
function createProductList(products) {
  if (!products) {
    throw new Error('Products required')
  }
  const renderStars = (rating) => {
    let stars = ''
    for (let i = 1; i <= 5; i++) {
      stars += i <= rating ? '★' : '☆'
    }
    return stars
  }
  const cards = products
    .map(
      (product) => `
        <div class="product-card">
            <h3>${product.name}</h3>
            <p class="price">$${product.price}</p>
            <div class="rating">
                ${renderStars(product.rating)}
            </div>
        </div>
    `
    )
    .join('')
  const html = `
        <div class="product-list">
            ${cards}
        </div>
    `
  console.log('Building product list')
  const result = {
    html: html,
    count: products.length,
    timestamp: Date.now(),
  }
  console.log('Modern DOM generated')
  return result
}
// Test the modern approach
const products = [
  { name: 'Laptop', price: 999, rating: 4 },
  { name: 'Phone', price: 699, rating: 5 },
]
const modernList = createProductList(products)
console.log('Generated', modernList.count, 'cards')
// Insert into DOM
const container = document.createElement('div')
container.innerHTML = modernList.html
console.log('DOM ready:', container.children.length)

Technical Trivia

The DOM Generation Bug of 2018: A major news site crashed when developers used unescaped template literals for user comments. The bug allowed malicious users to inject scripts through innerHTML, compromising thousands of user sessions within hours.

Why the pattern failed: The implementation directly inserted user data into template literals without sanitization, creating XSS vulnerabilities. When combined with innerHTML assignment, attackers could execute arbitrary JavaScript in other users' browsers.

Modern tooling prevents these issues: Today's frameworks like React and Vue automatically escape user content by default. When using vanilla JavaScript with template literals, always sanitize user input or use textContent for dynamic values to prevent XSS attacks.


Master DOM Generation: Implementation Strategy

Choose template literals for DOM generation when building component-based UIs without a framework. The HTML readability and reduced boilerplate make development faster and maintenance easier. Always escape user input to prevent XSS, and consider using a templating library for complex applications with extensive interactivity.