Làm thế nào để thực thi một chức năng khi trang đã được tải đầy đủ?


307

Tôi cần phải thực thi một số mã JavaScript khi trang đã được tải đầy đủ. Điều này bao gồm những thứ như hình ảnh.

Tôi biết bạn có thể kiểm tra xem DOM đã sẵn sàng chưa, nhưng tôi không biết liệu điều này có giống như khi trang được tải đầy đủ hay không.


7
Vì vậy, làm thế nào để bạn kiểm tra nếu DOM đã sẵn sàng?
Mads Skjern

Câu trả lời:


442

Đó gọi là load. Nó đã xuất hiện trước khi DOM sẵn sàng và DOM sẵn sàng thực sự được tạo ra với lý do chính xác là loadchờ đợi trên hình ảnh.

window.addEventListener('load', function () {
  alert("It's loaded!")
})

3
vì vậy, chỉ cần làm rõ (nếu tôi có thể), so sánh với DOM đã sẵn sàng, window.onloadđược gọi khi mọi thành phần / độ phân giải của trang (tức là * bao gồm * hình ảnh). Tôi có đúng không
BreakPhreak

19
@BreakPhreak: có :) onloadchờ tất cả các tài nguyên là một phần của tài liệu. Tất nhiên, điều này loại trừ các yêu cầu được tạo một cách linh hoạt không phải là một phần của chính tài liệu, ví dụ: yêu cầu AJAX.
Matchu

3
tập lệnh không được tải đầy đủ
HD ..

Điều gì xảy ra nếu tập lệnh của tôi có thể được tải động và sự kiện "tải" xảy ra trước khi tôi thêm trình xử lý của mình?
pamelus

31
Cách tốt hơn sẽ là addEventListener("load", function(){... })thay vì ghi đè onloadbất động sản.
dùng4642212

30

Thông thường bạn có thể sử dụng window.onload, nhưng bạn có thể nhận thấy rằng các trình duyệt gần đây không kích hoạt window.onloadkhi bạn sử dụng các nút lịch sử lùi / tiến.

Một số người đề xuất những mâu thuẫn kỳ lạ để giải quyết vấn đề này, nhưng thực sự nếu bạn chỉ cần window.onunloadxử lý (thậm chí một công cụ không làm gì cả), hành vi lưu trữ này sẽ bị vô hiệu hóa trong tất cả các trình duyệt. Các MDC tài liệu "tính năng" này khá tốt, nhưng đối với một số lý do vẫn có những người sử dụng setIntervalvà hacks khác lạ.

Một số phiên bản của Opera có một lỗi có thể được khắc phục bằng cách thêm phần sau vào đâu đó trong trang của bạn:

<script>history.navigationMode = 'compatible';</script>

Nếu bạn chỉ đang cố gắng để có được một hàm javascript được gọi một lần cho mỗi lượt xem (và không nhất thiết là sau khi DOM tải xong), bạn có thể làm một cái gì đó như thế này:

<img src="javascript:location.href='javascript:yourFunction();';">

Ví dụ: tôi sử dụng thủ thuật này để tải trước một tệp rất lớn vào bộ đệm trên màn hình tải:

<img src="bigfile"
onload="this.location.href='javascript:location.href=\'javascript:doredir();\';';doredir();">

Bất cứ ai có thể làm rõ làm thế nào thủ thuật này hoạt động? Quá phức tạp đối với tôi, doh ..
Razzle

20

Để hoàn thiện, bạn cũng có thể muốn liên kết nó với DOMContentLoaded, hiện được hỗ trợ rộng rãi

document.addEventListener("DOMContentLoaded", function(event){
  // your code here
});

Thông tin thêm: https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded


7
Câu trả lời này hoàn toàn ngược lại với những gì được hỏi trong câu hỏi.
Muhammad bin Yusrat

2
Thật vậy, sự kiện DOMContentLoaded được kích hoạt khi tất cả các nội dung DOM đã được tải, trước khi nó đã tải tất cả các phụ thuộc của nó. Vì người dùng trong chuỗi câu trả lời được tham chiếu, $.readytôi nghĩ rằng nó đã đóng góp tốt. Btw. Tôi cũng sẽ sử dụng addEventListener-method cho loadsự kiện này, vì nó cho phép bạn có nhiều cuộc gọi lại:window.addEventListener("load", function(event){ // your code here });
murb

16

Hãy thử nó chỉ chạy sau khi toàn bộ trang đã được tải

Bằng Javascript

window.onload = function(){
    // code goes here
};

Bởi Jquery

$(window).bind("load", function() {
    // code goes here
});

1
$(window)làm cho tôi nghĩ rằng đây sẽ là jquery - phải không? Hoặc tôi đang nhận được một số cú pháp javascript nhầm lẫn? (Tôi mới biết về JS).
Azendale

2
Tại sao không sử dụng đơn giản $(document).ready();khi jQuery có sẵn?
Andreas

của bạn là tài liệu (ít nhiều chỉ là HTML được phân tích cú pháp), cái còn lại ("tải") là tất cả mọi thứ bao gồm cả hình ảnh và kiểu dáng. Phụ thuộc vào những gì bạn cần.
amenthes

11

Hãy thử mã này

document.onreadystatechange = function () {
  if (document.readyState == "interactive") {
    initApplication();
  }
}

truy cập https://developer.mozilla.org/en-US/docs/DOM/document. yetState để biết thêm chi tiết


Vâng, điều này rất hữu ích. Cảm ơn rất nhiều ~
Bravo Yeung

2
"interactive"không được tải đầy đủ. "complete"đã được tải đầy đủ
Ryan Walker

Cuối cùng! Cảm ơn một triệu, Jacob. Tất cả nhiều phương pháp được liệt kê ở đây đều thất bại (tốt nhất là một radiobutton sẽ được cập nhật và tính toán kết quả có thể được thực hiện, nhưng nút sẽ không xuất hiện nhấn), phương pháp của bạn thực hiện thủ thuật.
giây

8

sự kiện window.onload sẽ kích hoạt khi mọi thứ được tải, bao gồm cả hình ảnh, v.v.

Bạn sẽ muốn kiểm tra trạng thái sẵn sàng của DOM nếu bạn muốn mã js của mình thực thi sớm nhất có thể, nhưng bạn vẫn cần truy cập các phần tử DOM.


8

Javascript sử dụng onLoad()sự kiện này, sẽ đợi trang được tải trước khi thực thi.

<body onload="somecode();" >

Nếu bạn đang sử dụng chức năng sẵn sàng tài liệu của khung công tác jQuery, mã sẽ được tải ngay khi DOM được tải và trước khi nội dung trang được tải:

$(document).ready(function() {
    // jQuery code goes here
});

7

Bạn có thể muốn sử dụng window.onload , vì các tài liệu chỉ ra rằng nó không được kích hoạt cho đến khi cả DOM đã sẵn sàng và TẤT CẢ các tài sản khác trong trang (hình ảnh, v.v.) được tải.


Ah rực rỡ. Vâng, tôi đã làm điều này. Hình ảnh cuối cùng trên trang này là: <img src = "imdbupdate.php? Update = ajax" style = "display: hidden" onload = "window.location = 'movies.php? Do = admincp'" /> Tuy nhiên không đọc hướng dẫn cho tôi
Ben Shelock

...gì? Bạn muốn chuyển hướng một khi hình ảnh tải?
Matchu

Tôi không chắc tại sao bạn muốn điều đó, nhưng lý do nó không chuyển hướng có thể là do nó hiển thị: bị ẩn và do đó trình duyệt không bận tâm tải nó vì nó sẽ không được hiển thị.
Matchu

có lẽ đó chỉ là một hình ảnh ẩn làm một cái gì đó quan trọng trên máy chủ, chẳng hạn như theo dõi một cú đánh hoặc làm gì đó trong DB?
Marc Novakowski

Tôi có thể có được điều đó, nhưng để nó chuyển hướng sau khi không có ý nghĩa với tôi. Tại sao lại có trang này nếu bạn không muốn người dùng dành thời gian cho nó? Và nếu mục tiêu là chuyển hướng khi tải, tại sao không sử dụng sự kiện window.onload, vì đó là một triển khai tổng thể sạch hơn?
Matchu

3

Và đây là một cách để làm điều đó với PrototypeJS :

Event.observe(window, 'load', function(event) {
    // Do stuff
});

2

Trong các trình duyệt hiện đại có javascript hiện đại (> = 2015), bạn có thể thêm type="module"vào thẻ tập lệnh của mình và mọi thứ bên trong tập lệnh đó sẽ thực thi sau khi tải toàn bộ trang. ví dụ:

<script type="module">
  alert("runs after") // Whole page loads before this line execute
</script>
<script>
  alert("runs before")
</script>

các trình duyệt cũ hơn sẽ hiểu nomodulethuộc tính. Một cái gì đó như thế này:

<script nomodule>
  alert("tuns after")
</script>

Để biết thêm thông tin bạn có thể truy cập javascript.info .


1

Nếu bạn cần sử dụng nhiều onloadsử dụng $(window).loadthay thế (jQuery):

$(window).load(function() {
    //code
});

1

Các onload tài sản của GlobalEventHandlers mixin là một event handler cho sự kiện load của một cửa sổ, XMLHttpRequest, yếu tố, vv mà cháy khi tài nguyên đã được nạp.

Vì vậy, về cơ bản, javascript đã có phương thức onload trên cửa sổ để thực thi trang nào được tải đầy đủ bao gồm cả hình ảnh ...

Bạn có thể làm một cái gì đó:

var spinner = true;

window.onload = function() {
  //whatever you like to do now, for example hide the spinner in this case
  spinner = false;
};

-1

Cập nhật 2019: Đây là câu trả lời phù hợp với tôi. Vì tôi cần nhiều yêu cầu ajax để bắn và trả lại dữ liệu trước để đếm các mục danh sách.

$(document).ajaxComplete(function(){
       alert("Everything is ready now!");
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.