# JS DOM manipulation

JavaScript DOM manipulation is a fundamental skill for any web developer. The Document Object Model (DOM) is an interface that represents the structure of a web page. By manipulating the DOM, you can dynamically change the content, structure, and style of a web page without reloading it. This blog will walk you through the basics of DOM manipulation, key methods, and some practical examples to get you started.

## Understanding the DOM

The DOM is a tree-like structure where each node represents a part of the document. Nodes can be elements, attributes, or text content. Here's a simple example of HTML and its corresponding DOM structure:

### HTML

```html
<!DOCTYPE html>
<html>
<head>
    <title>DOM Example</title>
</head>
<body>
    <h1>Hello, World!</h1>
    <p>This is a paragraph.</p>
</body>
</html>
```

### DOM Tree

* `html`
    
    * `head`
        
        * `title`
            
    * `body`
        
        * `h1`
            
        * `p`
            

## Selecting Elements

To manipulate the DOM, you first need to select the elements you want to change. JavaScript provides several methods for this:

1. `getElementById`: Selects an element by its ID.
    
2. `getElementsByClassName`: Selects elements by their class name.
    
3. `getElementsByTagName`: Selects elements by their tag name.
    
4. `querySelector`: Selects the first element that matches a CSS selector.
    
5. `querySelectorAll`: Selects all elements that match a CSS selector.
    

### Example

```html
<!DOCTYPE html>
<html>
<head>
    <title>DOM Manipulation</title>
</head>
<body>
    <div id="main">
        <h1 class="title">Hello, World!</h1>
        <p>This is a paragraph.</p>
    </div>

    <script>
        // Selecting elements
        const mainDiv = document.getElementById('main');
        const title = document.querySelector('.title');
        const paragraphs = document.getElementsByTagName('p');

        console.log(mainDiv); // <div id="main">...</div>
        console.log(title); // <h1 class="title">Hello, World!</h1>
        console.log(paragraphs); // HTMLCollection [ <p> ]
    </script>
</body>
</html>
```

## Modifying Content

Once you've selected an element, you can modify its content using properties like `innerHTML`, `textContent`, and `innerText`.

* `innerHTML`: Sets or gets the HTML content of an element.
    
* `textContent`: Sets or gets the text content of an element.
    
* `innerText`: Similar to `textContent`, but it also respects styling such as `display: none`.
    

### Example

```html
<!DOCTYPE html>
<html>
<head>
    <title>DOM Manipulation</title>
</head>
<body>
    <h1 id="header">Original Title</h1>
    <p id="paragraph">Original Paragraph</p>

    <script>
        // Modifying content
        const header = document.getElementById('header');
        const paragraph = document.getElementById('paragraph');

        header.innerHTML = 'Updated Title';
        paragraph.textContent = 'Updated Paragraph';

        console.log(header.innerHTML); // Updated Title
        console.log(paragraph.textContent); // Updated Paragraph
    </script>
</body>
</html>
```

## Changing Styles

You can dynamically change the styles of elements using the `style` property or by adding/removing CSS classes.

### Example

```html
<!DOCTYPE html>
<html>
<head>
    <title>DOM Manipulation</title>
    <style>
        .highlight {
            background-color: yellow;
        }
    </style>
</head>
<body>
    <p id="paragraph">This is a paragraph.</p>

    <script>
        // Changing styles
        const paragraph = document.getElementById('paragraph');
        
        // Directly using style property
        paragraph.style.color = 'blue';
        paragraph.style.fontSize = '20px';

        // Using CSS classes
        paragraph.classList.add('highlight');

        console.log(paragraph.style.color); // blue
        console.log(paragraph.style.fontSize); // 20px
        console.log(paragraph.classList.contains('highlight')); // true
    </script>
</body>
</html>
```

## Adding and Removing Elements

You can create, append, and remove elements dynamically using methods like `createElement`, `appendChild`, and `removeChild`.

### Example

```html
<!DOCTYPE html>
<html>
<head>
    <title>DOM Manipulation</title>
</head>
<body>
    <div id="container"></div>

    <script>
        // Creating new elements
        const container = document.getElementById('container');
        const newParagraph = document.createElement('p');
        newParagraph.textContent = 'This is a new paragraph.';

        // Appending the new element
        container.appendChild(newParagraph);

        // Removing an element
        const oldParagraph = document.querySelector('p');
        container.removeChild(oldParagraph);

        console.log(container.innerHTML); // <p>This is a new paragraph.</p>
    </script>
</body>
</html>
```

## Event Handling

Interacting with the DOM often involves handling user events like clicks, input changes, and form submissions. You can add event listeners to elements using the `addEventListener` method.

### Example

```html
<!DOCTYPE html>
<html>
<head>
    <title>DOM Manipulation</title>
</head>
<body>
    <button id="myButton">Click Me!</button>
    <p id="message"></p>

    <script>
        // Adding an event listener
        const button = document.getElementById('myButton');
        const message = document.getElementById('message');

        button.addEventListener('click', () => {
            message.textContent = 'Button was clicked!';
        });

        console.log(button); // <button id="myButton">Click Me!</button>
    </script>
</body>
</html>
```
