Skip to content

Quick Misc Edits (Perbaikan UX Search Overlay)

1. Pindahkan HTML Overlay dari PHP ke JavaScript

Alasan:

  • Lebih terorganisir — HTML search hidup bersama logic JavaScript-nya
  • Jika user disable JavaScript, HTML overlay tidak perlu dikirim (hemat bytes)

Hapus dari footer.php: Hapus seluruh <div class="search-overlay">...</div> dari footer.php.

Tambah method addSearchHTML() di Search.js:

js
class Search {
  constructor() {
    this.addSearchHTML();  // ← HARUS dipanggil pertama!
    this.resultsDiv = $("#search-overlay__results");
    this.openButton = $(".js-search-trigger");
    this.closeButton = $(".search-overlay__close");
    this.searchOverlay = $(".search-overlay");
    this.searchField = $("#search-term");
    // ... sisanya tetap sama
  }

  // ... method lainnya ...

  addSearchHTML() {
    $("body").append(`
      <div class="search-overlay">
        <div class="search-overlay__top">
          <div class="container">
            <i class="fa fa-search search-overlay__icon" aria-hidden="true"></i>
            <input type="text" class="search-term" placeholder="What are you looking for?" id="search-term" autocomplete="off">
            <i class="fa fa-window-close search-overlay__close" aria-hidden="true"></i>
          </div>
        </div>
        <div class="container">
          <div id="search-overlay__results"></div>
        </div>
      </div>
    `);
  }
}

Penting: Urutan di Constructor

this.addSearchHTML() HARUS dipanggil sebelum property lain yang mencari elemen DOM (seperti this.searchField = $("#search-term")), karena elemen tersebut belum ada di DOM sebelum method ini dijalankan.

2. Kurangi Typing Timer

Sebelum:

js
this.typingTimer = setTimeout(this.getResults.bind(this), 2000);

Sesudah:

js
this.typingTimer = setTimeout(this.getResults.bind(this), 750);

750ms (3/4 detik) terasa lebih responsif daripada 2000ms.

3. Auto-Focus pada Text Field

Masalah:

Saat overlay dibuka, user harus klik manual ke text field sebelum bisa mengetik.

Solusi di openOverlay():

js
openOverlay() {
  this.searchOverlay.addClass("search-overlay--active");
  $("body").addClass("body-no-scroll");
  this.searchField.val('');  // ← kosongkan field
  setTimeout(() => this.searchField.focus(), 301);
}

Kenapa 301ms?

  • Overlay menggunakan CSS transition 300ms untuk fade-in
  • Browser tidak bisa focus elemen yang belum visible
  • 301ms = cukup waktu untuk transition selesai, baru focus

Arrow Function di setTimeout

js
// Cara panjang:
setTimeout(function() {
  this.searchField.focus();
}.bind(this), 301);

// Cara singkat (ES6 arrow function):
setTimeout(() => this.searchField.focus(), 301);

Arrow function:

  • Tidak perlu .bind(this)
  • Tidak perlu curly brackets untuk single-line body
  • Tidak perlu semicolon di dalam body

4. Kosongkan Field Saat Reopen

Di openOverlay(), tambahkan sebelum setTimeout:

js
this.searchField.val('');

Sehingga setiap kali overlay dibuka ulang, field sudah bersih — user langsung bisa cari hal baru.

Kode Lengkap openOverlay():

js
openOverlay() {
  this.searchOverlay.addClass("search-overlay--active");
  $("body").addClass("body-no-scroll");
  this.searchField.val('');
  setTimeout(() => this.searchField.focus(), 301);
}