Tutorial js

DOM Manipulation JavaScript

DOM Manipulation adalah cara JavaScript berinteraksi dengan halaman web. Anda bisa mengubah text, warna, gambar, dan apapun di halaman web secara real-time!

Apa itu DOM?

DOM (Document Object Model) adalah representasi halaman web dalam bentuk object yang bisa dimanipulasi JavaScript. Bayangkan DOM seperti pohon keluarga website.

// DOM memungkinkan kita mengubah halaman web
document.getElementById("judul").innerHTML = "Judul Baru!";
document.getElementById("tombol").style.backgroundColor = "blue";

Mengakses Element HTML

1. Berdasarkan ID

<h1 id="judul_utama">Judul Asli</h1>
<script>
  let element_judul = document.getElementById("judul_utama");
  element_judul.innerHTML = "Judul Sudah Diubah!";
</script>

2. Berdasarkan Class

<p class="text_info">Info 1</p>
<p class="text_info">Info 2</p>

<script>
  let semua_info = document.getElementsByClassName("text_info");
  semua_info[0].innerHTML = "Info pertama diubah";
  semua_info[1].innerHTML = "Info kedua diubah";
</script>

3. Berdasarkan Tag

<p>Paragraf 1</p>
<p>Paragraf 2</p>

<script>
  let semua_paragraf = document.getElementsByTagName("p");
  for (let i = 0; i < semua_paragraf.length; i++) {
    semua_paragraf[i].style.color = "red";
  }
</script>

4. Query Selector (Modern Way)

<div class="container">
  <h2 id="sub_judul">Sub Judul</h2>
  <button class="btn_primary">Klik</button>
</div>

<script>
  let sub_judul = document.querySelector("#sub_judul");
  let tombol_primary = document.querySelector(".btn_primary");
  let container_utama = document.querySelector(".container");
</script>

Mengubah Konten

1. Mengubah Text

<p id="teks_sambutan">Selamat datang</p>

<script>
  function ubah_sambutan(nama_user) {
    let element_sambutan = document.getElementById("teks_sambutan");
    element_sambutan.innerHTML = "Selamat datang, " + nama_user + "!";
  }

  ubah_sambutan("Budi");
</script>

2. Mengubah HTML

<div id="konten_utama">
  <p>Konten lama</p>
</div>

<script>
  function ganti_konten() {
    let konten_div = document.getElementById("konten_utama");
    konten_div.innerHTML = `
            <h3>Konten Baru!</h3>
            <p>Ini adalah konten yang sudah diperbarui</p>
            <button onclick="alert('Tombol diklik!')">Klik Saya</button>
        `;
  }

  ganti_konten();
</script>

Mengubah Style CSS

1. Mengubah Warna

<h1 id="judul_colorful">Judul Warna</h1>
<button onclick="ubah_warna_judul()">Ubah Warna</button>

<script>
  function ubah_warna_judul() {
    let judul_element = document.getElementById("judul_colorful");
    judul_element.style.color = "blue";
    judul_element.style.backgroundColor = "yellow";
    judul_element.style.padding = "10px";
  }
</script>

2. Mengubah Ukuran dan Font

<p id="teks_format">Text yang akan diformat</p>
<button onclick="format_text()">Format Text</button>

<script>
  function format_text() {
    let text_element = document.getElementById("teks_format");
    text_element.style.fontSize = "24px";
    text_element.style.fontWeight = "bold";
    text_element.style.fontFamily = "Arial";
    text_element.style.textAlign = "center";
  }
</script>

Event Handling

1. Click Event

<button id="tombol_klik">Klik Saya!</button>
<p id="hasil_klik">Belum diklik</p>

<script>
  let tombol_element = document.getElementById("tombol_klik");
  let hasil_element = document.getElementById("hasil_klik");
  let jumlah_klik = 0;

  tombol_element.onclick = function () {
    jumlah_klik++;
    hasil_element.innerHTML = "Tombol sudah diklik " + jumlah_klik + " kali";

    if (jumlah_klik >= 5) {
      tombol_element.style.backgroundColor = "green";
      tombol_element.innerHTML = "Wow! " + jumlah_klik + " klik!";
    }
  };
</script>

2. Input Event

<input type="text" id="input_nama" placeholder="Ketik nama Anda" />
<p id="output_nama">Nama akan muncul di sini</p>

<script>
  let input_element = document.getElementById("input_nama");
  let output_element = document.getElementById("output_nama");

  input_element.oninput = function () {
    let nama_user = input_element.value;
    if (nama_user.length > 0) {
      output_element.innerHTML = "Halo, " + nama_user + "!";
      output_element.style.color = "green";
    } else {
      output_element.innerHTML = "Nama akan muncul di sini";
      output_element.style.color = "black";
    }
  };
</script>

Contoh Project Sederhana

1. Counter App

Buat file counter.html:

<!DOCTYPE html>
<html>
  <head>
    <title>Counter App</title>
    <style>
      .container_counter {
        text-align: center;
        padding: 20px;
        font-family: Arial;
      }
      .angka_counter {
        font-size: 48px;
        color: blue;
        margin: 20px;
      }
      .btn_counter {
        padding: 10px 20px;
        margin: 5px;
        font-size: 16px;
        cursor: pointer;
      }
    </style>
  </head>
  <body>
    <div class="container_counter">
      <h1>Counter App</h1>
      <div class="angka_counter" id="display_counter">0</div>

      <button class="btn_counter" onclick="tambah_counter()">+ Tambah</button>
      <button class="btn_counter" onclick="kurang_counter()">- Kurang</button>
      <button class="btn_counter" onclick="reset_counter()">Reset</button>
    </div>

    <script>
      let nilai_counter = 0;
      let display_element = document.getElementById("display_counter");

      function tambah_counter() {
        nilai_counter++;
        update_display();
      }

      function kurang_counter() {
        nilai_counter--;
        update_display();
      }

      function reset_counter() {
        nilai_counter = 0;
        update_display();
      }

      function update_display() {
        display_element.innerHTML = nilai_counter;

        // Ubah warna berdasarkan nilai
        if (nilai_counter > 0) {
          display_element.style.color = "green";
        } else if (nilai_counter < 0) {
          display_element.style.color = "red";
        } else {
          display_element.style.color = "blue";
        }
      }
    </script>
  </body>
</html>

2. To-Do List Sederhana

<!DOCTYPE html>
<html>
  <head>
    <title>To-Do List</title>
    <style>
      .container_todo {
        max-width: 500px;
        margin: 20px auto;
        padding: 20px;
        font-family: Arial;
      }
      .input_todo {
        width: 70%;
        padding: 10px;
        font-size: 16px;
      }
      .btn_add {
        padding: 10px 15px;
        font-size: 16px;
        background: blue;
        color: white;
        border: none;
        cursor: pointer;
      }
      .item_todo {
        padding: 10px;
        margin: 5px 0;
        background: #f0f0f0;
        border-radius: 5px;
      }
    </style>
  </head>
  <body>
    <div class="container_todo">
      <h1>My To-Do List</h1>

      <div>
        <input
          type="text"
          id="input_task"
          class="input_todo"
          placeholder="Tambah task baru..."
        />
        <button class="btn_add" onclick="tambah_task()">Tambah</button>
      </div>

      <div id="list_todo"></div>
    </div>

    <script>
      let daftar_task = [];
      let input_element = document.getElementById("input_task");
      let list_element = document.getElementById("list_todo");

      function tambah_task() {
        let task_baru = input_element.value;

        if (task_baru.trim() !== "") {
          daftar_task.push(task_baru);
          input_element.value = "";
          tampilkan_task();
        } else {
          alert("Task tidak boleh kosong!");
        }
      }

      function hapus_task(index_task) {
        daftar_task.splice(index_task, 1);
        tampilkan_task();
      }

      function tampilkan_task() {
        let html_content = "";

        for (let i = 0; i < daftar_task.length; i++) {
          html_content += `
                    <div class="item_todo">
                        ${i + 1}. ${daftar_task[i]}
                        <button onclick="hapus_task(${i})" style="float: right; background: red; color: white; border: none; padding: 5px 10px; cursor: pointer;">Hapus</button>
                    </div>
                `;
        }

        list_element.innerHTML = html_content;
      }

      // Event listener untuk Enter key
      input_element.addEventListener("keypress", function (event) {
        if (event.key === "Enter") {
          tambah_task();
        }
      });
    </script>
  </body>
</html>

Latihan DOM Manipulation

Latihan 1: Theme Switcher

<!DOCTYPE html>
<html>
  <head>
    <title>Theme Switcher</title>
    <style>
      .theme_light {
        background-color: white;
        color: black;
      }
      .theme_dark {
        background-color: #333;
        color: white;
      }
      .container_theme {
        padding: 20px;
        text-align: center;
        min-height: 100vh;
      }
    </style>
  </head>
  <body class="theme_light">
    <div class="container_theme">
      <h1 id="judul_theme">Theme Switcher</h1>
      <p id="desc_theme">Klik tombol untuk mengubah tema</p>

      <button onclick="ganti_theme()">Ganti Tema</button>
      <button onclick="random_color()">Warna Random</button>
    </div>

    <script>
      let tema_gelap = false;

      function ganti_theme() {
        let body_element = document.body;

        if (tema_gelap) {
          body_element.className = "theme_light";
          tema_gelap = false;
        } else {
          body_element.className = "theme_dark";
          tema_gelap = true;
        }
      }

      function random_color() {
        let warna_random =
          "#" + Math.floor(Math.random() * 16777215).toString(16);
        document.body.style.backgroundColor = warna_random;
      }
    </script>
  </body>
</html>

Latihan 2: Form Validation

<!DOCTYPE html>
<html>
  <head>
    <title>Form Validation</title>
    <style>
      .form_container {
        max-width: 400px;
        margin: 20px auto;
        padding: 20px;
        border: 1px solid #ccc;
      }
      .form_group {
        margin: 10px 0;
      }
      .form_input {
        width: 100%;
        padding: 8px;
        font-size: 14px;
      }
      .error_message {
        color: red;
        font-size: 12px;
      }
      .success_message {
        color: green;
        font-size: 12px;
      }
    </style>
  </head>
  <body>
    <div class="form_container">
      <h2>Form Registrasi</h2>

      <div class="form_group">
        <label>Nama Lengkap:</label>
        <input type="text" id="input_nama" class="form_input" />
        <div id="error_nama" class="error_message"></div>
      </div>

      <div class="form_group">
        <label>Email:</label>
        <input type="email" id="input_email" class="form_input" />
        <div id="error_email" class="error_message"></div>
      </div>

      <div class="form_group">
        <label>Password:</label>
        <input type="password" id="input_password" class="form_input" />
        <div id="error_password" class="error_message"></div>
      </div>

      <button onclick="validasi_form()">Daftar</button>

      <div id="status_form"></div>
    </div>

    <script>
      function validasi_form() {
        let nama_value = document.getElementById("input_nama").value;
        let email_value = document.getElementById("input_email").value;
        let password_value = document.getElementById("input_password").value;

        let valid_form = true;

        // Reset error messages
        document.getElementById("error_nama").innerHTML = "";
        document.getElementById("error_email").innerHTML = "";
        document.getElementById("error_password").innerHTML = "";

        // Validasi nama
        if (nama_value.length < 3) {
          document.getElementById("error_nama").innerHTML =
            "Nama minimal 3 karakter";
          valid_form = false;
        }

        // Validasi email
        if (!email_value.includes("@") || !email_value.includes(".")) {
          document.getElementById("error_email").innerHTML =
            "Format email tidak valid";
          valid_form = false;
        }

        // Validasi password
        if (password_value.length < 6) {
          document.getElementById("error_password").innerHTML =
            "Password minimal 6 karakter";
          valid_form = false;
        }

        // Status form
        let status_element = document.getElementById("status_form");
        if (valid_form) {
          status_element.innerHTML =
            "<div class='success_message'>✅ Registrasi berhasil!</div>";
        } else {
          status_element.innerHTML =
            "<div class='error_message'>❌ Mohon perbaiki error di atas</div>";
        }
      }
    </script>
  </body>
</html>

Tips DOM Manipulation

1. Cache Element References

// ❌ Tidak efisien
function update_content() {
  document.getElementById("title").innerHTML = "New Title";
  document.getElementById("title").style.color = "red";
  document.getElementById("title").style.fontSize = "20px";
}

// ✅ Efisien
function update_content() {
  let title_element = document.getElementById("title");
  title_element.innerHTML = "New Title";
  title_element.style.color = "red";
  title_element.style.fontSize = "20px";
}

2. Use Modern Event Listeners

// ❌ Cara lama
element.onclick = function () {
  /* ... */
};

// ✅ Cara modern
element.addEventListener("click", function () {
  /* ... */
});

3. Check if Element Exists

function update_element(element_id) {
  let element = document.getElementById(element_id);
  if (element) {
    element.innerHTML = "Updated!";
  } else {
    console.log("Element not found: " + element_id);
  }
}

Kesimpulan

DOM Manipulation membuat website jadi interaktif!

Yang sudah dipelajari:

  • ✅ Mengakses element HTML dengan berbagai cara
  • ✅ Mengubah konten dan style element
  • ✅ Event handling (click, input, dll)
  • ✅ Project: Counter, To-Do List, Theme Switcher
  • ✅ Form validation dengan JavaScript
  • ✅ Tips dan best practices

Next: Selamat! Anda sudah menguasai dasar-dasar JavaScript! 🎉