Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

$(document).ready() tương đương trong JavaScript thuần (Vanilla JS)

Trong jQuery, $(document).ready() chạy code khi DOM đã sẵn sàng (trước khi tải hình ảnh, CSS...). Vanilla JS có các cách tương đương:

1. DOMContentLoaded (Khuyến nghị nhất)

Sự kiện kích hoạt khi HTML hoàn toàn parse xong, DOM tree sẵn sàng.


document.addEventListener('DOMContentLoaded', function() {
  console.log('DOM ready!');
  // Khởi tạo app, gán event listener...
});

2. window.onload (Load event)

Chạy khi toàn bộ trang tải xong: HTML, CSS, JS, hình ảnh, iframe... Chậm hơn DOMContentLoaded.


window.addEventListener('load', function() {
  console.log('Trang tải hoàn toàn!');
  // Đo kích thước ảnh, layout...
});

3. Script đặt cuối <body> (Cách cổ điển)

Đặt <script> trước </body> – DOM ở trên đã parse xong.


<body>
  <!-- Nội dung -->
  <script>
    // DOM đã sẵn sàng
    initApp();
  </script>
</body>

4. defer attribute (Hiện đại, khuyến nghị)

Script tải song song, thực thi theo thứ tự sau khi HTML parse xong (tương tự DOMContentLoaded).


<script src="app.js" defer></script>

5. async attribute

Tải song song, thực thi ngay khi tải xong (không đảm bảo thứ tự, không chờ DOM).


<script src="analytics.js" async></script>

So sánh

CáchThời điểm chạyThứ tựChờ DOM?Chờ tài nguyên?
DOMContentLoadedDOM parse xongĐăng ký trước → chạy trướcCóKhông
window.onloadTất cả tải xongĐăng ký trước → chạy trướcCóCó
Script cuối bodyNgay khi gặp scriptThứ tự viếtCó (phần trên)Không
deferDOM parse xongThứ tự viếtCóKhông
asyncScript tải xongKhông đảm bảoKhôngKhông

Polyfill cho code cũ (setInterval check)

Bài gốc dùng setInterval kiểm tra document.readyState – cách này cũ, không khuyến khích.


// Cách cũ (không khuyến khích)
var loader = setInterval(function() {
  if (document.readyState !== "complete") return;
  clearInterval(loader);
  initApp();
}, 300);

Best Practice hiện nay

  1. Dùng <script defer src="..."> trong <head> – đơn giản, chuẩn, hiệu năng tốt.
  2. Hoặc DOMContentLoaded cho inline script/module.
  3. Tránh window.onload trừ khi cần kích thước ảnh/font.
  4. Tránh async cho script phụ thuộc DOM.