window.onload so với $ (tài liệu). yet ()


1245

Sự khác biệt giữa phương thức window.onloadcủa JavaScript và jQuery là $(document).ready()gì?



Hầu hết các câu trả lời ở đây đã lỗi thời. Cách jQuery hiện đang thực hiện $().ready()làm cho nó khởi động sau window.onloadnhiều lần.
Shikkediel

Câu trả lời:


1243

Sự readykiện xảy ra sau khi tài liệu HTML đã được tải, trong khi onloadsự kiện xảy ra sau đó, khi tất cả nội dung (ví dụ hình ảnh) cũng đã được tải.

Sự onloadkiện này là một sự kiện tiêu chuẩn trong DOM, trong khi readysự kiện này dành riêng cho jQuery. Mục đích của readysự kiện là nó sẽ xảy ra càng sớm càng tốt sau khi tài liệu được tải, để mã bổ sung chức năng cho các thành phần trong trang không phải chờ tất cả nội dung được tải.


153
@baptx: Bạn sai rồi. Sự readykiện này dành riêng cho jQuery. Nó đang sử dụng DOMContentLoadedsự kiện nếu nó có sẵn trong trình duyệt, nếu không nó sẽ mô phỏng nó. Không có tương đương chính xác trong DOM vì DOMContentLoadedsự kiện này không được hỗ trợ trong tất cả các trình duyệt.
Guffa

18
Ok nhưng kết quả tương tự tồn tại với DOMContentLoaded, có lẽ bạn nên chỉ định điều này
baptx

55
@baptx: Tôi không nghĩ rằng nó có liên quan đến câu hỏi và tôi vẫn không biết.
Guffa

17
Tại sao các downvote? Nếu bạn không giải thích những gì bạn nghĩ là sai, nó không thể cải thiện câu trả lời.
Guffa

4
Không có sự kiện như onload. onloadlà tên của một thuộc tính đối tượng lưu trữ một hàm sẽ được gọi khi loadsự kiện được kích hoạt.
Scott Marcus

140

window.onloadlà sự kiện JavaScript tích hợp, nhưng khi triển khai nó có các yêu cầu tinh vi trên các trình duyệt (Firefox, Internet Explorer 6, Internet Explorer 8 và Opera ), jQuery cung cấp document.ready, tóm tắt những thứ đó và kích hoạt ngay khi DOM của trang sẵn sàng (không chờ hình ảnh, v.v.).

$(document).ready(lưu ý rằng nó không document.ready , không xác định) là một hàm jQuery, bao bọc và cung cấp tính nhất quán cho các sự kiện sau:

  • document.ondomcontentready/ document.ondomcontentloaded- một sự kiện mới phát sinh khi DOM tài liệu được tải (có thể mất một thời gian trước khi hình ảnh, v.v. được tải); một lần nữa, hơi khác trong Internet Explorer và ở phần còn lại của thế giới
  • window.onload(được triển khai ngay cả trong các trình duyệt cũ), sẽ kích hoạt khi toàn bộ trang tải (hình ảnh, kiểu, v.v.)

16
Có một quan niệm sai lầm nhỏ ở đây: loadsự kiện windowđược triển khai hợp lý nhất quán trên các trình duyệt. Vấn đề mà jQuery và các thư viện khác đang cố gắng giải quyết là vấn đề bạn đã đề cập, đó là loadsự kiện không được kích hoạt cho đến khi tất cả các tài nguyên phụ thuộc như hình ảnh và bảng định kiểu đã được tải, có thể là một thời gian dài sau khi DOM được tải hoàn toàn, kết xuất và sẵn sàng cho sự tương tác. Sự kiện kích hoạt trong hầu hết các trình duyệt khi DOM đã sẵn sàng được gọi DOMContentLoaded, không phải DOMContentReady.
Tim Down

2
@Tim Down: hợp lý là từ khóa ở đây; ít nhất một số đối tượng đánh hơi được sử dụng là cần thiết, ngay cả với onload(có sự khác biệt wrt FF / IE / Opera). Đối với DOMContentLoaded, bạn hoàn toàn chính xác. Chỉnh sửa để làm rõ.
Piskvor rời khỏi tòa nhà

Những loại đối tượng đánh hơi có nghĩa là gì?
Tim Down

1
@Tim Down: Tôi biết Opera đã có nó, nhưng trình kích hoạt sự kiện trên đó hơi kỳ quặc (để kích hoạt một cách đáng tin cậy, document.onloadcó thể sử dụng được). Theo như window.onload đi: window.onload = fn1;window.onload=fn2;- chỉ fn2 mới được gọi onload. Một số webhost miễn phí chèn mã riêng của họ vào tài liệu và đôi khi điều này làm tắc nghẽn mã trong trang.
Piskvor rời khỏi tòa nhà

1
Không viết "document. Yet" không chính xác? đối tượng tài liệu không có phương thức sẵn sàng, đối tượng jQuery thực hiện được trả về từ lệnh gọi $ (document). Vui lòng chỉnh sửa câu trả lời này nếu tôi đúng vì điều này rất khó hiểu.
A. Sallai

87

$(document).ready()là một sự kiện jQuery. JQuery$(document).ready()Phương thức được gọi ngay khi DOM sẵn sàng (có nghĩa là trình duyệt đã phân tích cú pháp HTML và xây dựng cây DOM). Điều này cho phép bạn chạy mã ngay khi tài liệu đã sẵn sàng để được thao tác.

Ví dụ: nếu một trình duyệt hỗ trợ sự kiện DOMContentLoaded (như nhiều trình duyệt không phải IE làm), thì nó sẽ kích hoạt sự kiện đó. (Lưu ý rằng sự kiện DOMContentLoaded chỉ được thêm vào IE trong IE9 +.)

Hai cú pháp có thể được sử dụng cho việc này:

$( document ).ready(function() {
   console.log( "ready!" );
});

Hoặc phiên bản tốc ký:

$(function() {
   console.log( "ready!" );
});

Những điểm chính cho $(document).ready():

  • Nó sẽ không chờ cho hình ảnh được tải.
  • Được sử dụng để thực thi JavaScript khi DOM được tải hoàn toàn. Đặt xử lý sự kiện ở đây.
  • Có thể sử dụng nhiều lần.
  • Thay thế $bằngjQuery khi bạn nhận được "$ không được xác định."
  • Không được sử dụng nếu bạn muốn thao tác hình ảnh. Sử dụng $(window).load()thay thế.

window.onload()là một hàm JavaScript nguyên gốc. Sự window.onload()kiện này kích hoạt khi tất cả nội dung trên trang của bạn đã được tải, bao gồm DOM (mô hình đối tượng tài liệu), quảng cáo biểu ngữ và hình ảnh. Một điểm khác biệt giữa hai loại đó là, trong khi chúng ta có thể có nhiều hơn một $(document).ready()chức năng, chúng ta chỉ có thể có một onloadchức năng.


4
Điểm nhỏ: Các cuộc thảo luận về IE là từ ngữ kém. Không phải IE (8 trở về trước) "không thể kích hoạt an toàn" cho đến khi tài liệu readyState hoàn tất, đó là IE thiếu một sự kiện DOMContentLoaded. Không phải là vấn đề "an toàn", mà là một tính năng bị thiếu trong IE, được thêm vào trong IE 9.
ToolmakerSteve

Bạn đã đúng, vì vậy tôi đã chỉnh sửa câu trả lời để phản ánh nhận xét của bạn và cảm ơn!
James Drinkard

Bạn nói "Nó sẽ không đợi hình ảnh được tải." Những gì về các tập tin khác, js quan trọng nhất? Thường trước khi gọi hàm từ một tệp khác - tôi cần biết nếu nó được tải.
Darius.V

Đây là một chủ đề khác hoàn toàn, nhưng nếu tôi hiểu những gì bạn đang hỏi, thì nó dựa trên cách bạn cấu trúc trang của mình, bao gồm cả thứ tự bạn đặt các tệp js. Đây là một liên kết đi vào chi tiết hơn: ablogaboutcode.com/2011/06/14/NH HTH, James
James Drinkard

Tại sao ai đó muốn sử dụng $ (tài liệu). Đã () nhiều lần?
Usman

43

Sự kiện tải Windows sẽ kích hoạt khi tất cả nội dung trên trang của bạn được tải đầy đủ bao gồm nội dung DOM (mô hình đối tượng tài liệu) và JavaScript , khung và hình ảnh không đồng bộ . Bạn cũng có thể sử dụng body onload =. Cả hai đều giống nhau; window.onload = function(){}<body onload="func();">là những cách khác nhau để sử dụng cùng một sự kiện.

$document.readySự kiện chức năng jQuery thực thi sớm hơn một chút window.onloadvà được gọi sau khi DOM (mô hình đối tượng Tài liệu) được tải trên trang của bạn. Nó sẽ không chờ cho hình ảnh, khung hình được tải đầy đủ .

Lấy từ bài viết sau đây: thế nào $document.ready()là khác nhau từwindow.onload()


Tôi nghĩ rằng đây là câu trả lời tốt nhất!
Haoyu Chen

3
Tôi có thể đồng ý, nếu nó không được sao chép từng từ.
Kevin B

23

$(document).ready(function() {

    // Executes when the HTML document is loaded and the DOM is ready
    alert("Document is ready");
});

// .load() method deprecated from jQuery 1.8 onward
$(window).on("load", function() {

     // Executes when complete page is fully loaded, including
     // all frames, objects and images
     alert("Window is loaded");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>


22

Một lời cảnh báo về việc sử dụng $(document).ready()với Internet Explorer. Nếu một yêu cầu HTTP bị gián đoạn trước khi toàn bộ tài liệu được tải (ví dụ: trong khi một trang đang phát trực tuyến đến trình duyệt, một liên kết khác được nhấp vào) IE sẽ kích hoạt$(document).ready sự kiện.

Nếu bất kỳ mã trong $(document).ready() sự kiện tham chiếu các đối tượng DOM, thì không thể tìm thấy tiềm năng cho các đối tượng đó và có thể xảy ra lỗi Javascript. Hoặc bảo vệ các tham chiếu của bạn đến các đối tượng đó hoặc trì hoãn mã tham chiếu các đối tượng đó đến sự kiện window.load.

Tôi chưa thể tái tạo vấn đề này trong các trình duyệt khác (cụ thể là Chrome và Firefox)


Phiên bản nào của IE? Tôi biết tôi nên quan tâm đến khả năng tương thích, nhưng thật khó với IE. Có thể chấp nhận sử dụng document. Ready cho JavaScript không?
Monica


22

Một mẹo nhỏ:

Luôn luôn sử dụng window.addEventListenerđể thêm một sự kiện vào cửa sổ. Bởi vì theo cách đó bạn có thể thực thi mã trong các trình xử lý sự kiện khác nhau.

Mã chính xác:

window.addEventListener('load', function () {
  alert('Hello!')
})

window.addEventListener('load', function () {
  alert('Bye!')
})

Mã không hợp lệ:

window.onload = function () {
  alert('Hello!') // it will not work!!!
}

window.onload = function () {
  alert('Bye!') 
}

Điều này là do onload chỉ là tài sản của đối tượng, được ghi đè.

Bằng cách tương tự với addEventListener, nó là tốt hơn để sử dụng $(document).ready()hơn là tải.


3
Điều này không trả lời câu hỏi.

17

Sự kiện

$(document).on('ready', handler)liên kết với sự kiện đã sẵn sàng từ jQuery. Trình xử lý được gọi khi DOM được tải . Tài sản như hình ảnh có thể vẫn còn thiếu . Nó sẽ không bao giờ được gọi nếu tài liệu đã sẵn sàng tại thời điểm ràng buộc. jQuery sử dụng DOMContentLoaded -Event cho điều đó, mô phỏng nó nếu không có sẵn.

$(document).on('load', handler)là một sự kiện sẽ được kích hoạt khi tất cả các tài nguyên được tải từ máy chủ. Hình ảnh được tải ngay bây giờ. Mặc dù onload là một sự kiện HTML thô, sẵn sàng được tạo bởi jQuery.

Chức năng

$(document).ready(handler)thực sự là một lời hứa . Trình xử lý sẽ được gọi ngay lập tức nếu tài liệu đã sẵn sàng tại thời điểm gọi. Nếu không, nó liên kết với ready-Event.

Trước jQuery 1.8 , $(document).load(handler)tồn tại dưới dạng bí danh $(document).on('load',handler).

Đọc thêm


bạn có thể vui lòng giải thích $ (tài liệu) .load (xử lý) hoạt động giống như ràng buộc với sự kiện tải. Không giống như $ .fn. Yet, nó sẽ không gọi ngay lập tức?
Nabeel Khan

Tôi nghĩ rằng bạn đã bối rối bởi $.fn.loadđiều đó không còn hoạt động như chất kết dính sự kiện nữa. Trong thực tế, nó đã lỗi thời kể từ jquery 1.8. Tôi đã cập nhật nó cho phù hợp
abstraktor

16

Các $(document).ready()là một jQuery sự kiện đó xảy ra khi tài liệu HTML đã được nạp đầy đủ, trong khiwindow.onload sự kiện xảy ra sau đó, khi tất cả mọi thứ bao gồm cả hình ảnh trên trang nạp.

Ngoài ra window.onload là một sự kiện javascript thuần túy trong DOM, trong khi $(document).ready()sự kiện này là một phương thức trong jQuery.

$(document).ready() thường là trình bao bọc cho jQuery để đảm bảo tất cả các phần tử được tải vào sẽ được sử dụng trong jQuery ...

Nhìn vào mã nguồn jQuery để hiểu cách nó hoạt động:

jQuery.ready.promise = function( obj ) {
    if ( !readyList ) {

        readyList = jQuery.Deferred();

        // Catch cases where $(document).ready() is called after the browser event has already occurred.
        // we once tried to use readyState "interactive" here, but it caused issues like the one
        // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
        if ( document.readyState === "complete" ) {
            // Handle it asynchronously to allow scripts the opportunity to delay ready
            setTimeout( jQuery.ready );

        // Standards-based browsers support DOMContentLoaded
        } else if ( document.addEventListener ) {
            // Use the handy event callback
            document.addEventListener( "DOMContentLoaded", completed, false );

            // A fallback to window.onload, that will always work
            window.addEventListener( "load", completed, false );

        // If IE event model is used
        } else {
            // Ensure firing before onload, maybe late but safe also for iframes
            document.attachEvent( "onreadystatechange", completed );

            // A fallback to window.onload, that will always work
            window.attachEvent( "onload", completed );

            // If IE and not a frame
            // continually check to see if the document is ready
            var top = false;

            try {
                top = window.frameElement == null && document.documentElement;
            } catch(e) {}

            if ( top && top.doScroll ) {
                (function doScrollCheck() {
                    if ( !jQuery.isReady ) {

                        try {
                            // Use the trick by Diego Perini
                            // http://javascript.nwbox.com/IEContentLoaded/
                            top.doScroll("left");
                        } catch(e) {
                            return setTimeout( doScrollCheck, 50 );
                        }

                        // detach all dom ready events
                        detach();

                        // and execute any waiting functions
                        jQuery.ready();
                    }
                })();
            }
        }
    }
    return readyList.promise( obj );
};
jQuery.fn.ready = function( fn ) {
    // Add the callback
    jQuery.ready.promise().done( fn );

    return this;
};

Ngoài ra tôi đã tạo ra hình ảnh dưới đây như một tài liệu tham khảo nhanh cho cả hai:

nhập mô tả hình ảnh ở đây


1
đẹp, tham khảo các tài liệu là một điểm cộng .. thnx
Irf

13

window.onload: Một sự kiện JavaScript bình thường.

document. yet: Một sự kiện jQuery cụ thể khi toàn bộ HTML đã được tải.


11

Một điều cần nhớ (hoặc tôi nên nói là nhớ lại) là bạn không thể xếp chồng onloadnhư bạn có thể với ready. Nói cách khác, ma thuật jQuery cho phép nhiều readys trên cùng một trang, nhưng bạn không thể làm điều đó với onload.

Việc cuối cùng onloadsẽ ghi đè bất kỳ onloads trước đó .

Một cách hay để giải quyết vấn đề đó là với một hàm rõ ràng được viết bởi một Simon Willison và được mô tả trong Sử dụng nhiều hàm tải JavaScript .

function addLoadEvent(func) {
    var oldonload = window.onload;
    if (typeof window.onload != 'function') {
        window.onload = func;
    }
    else {
        window.onload = function() {
            if (oldonload) {
                oldonload();
            }
            func();
        }
    }
}

// Example use:
addLoadEvent(nameOfSomeFunctionToRunOnPageLoad);
addLoadEvent(function() {
  /* More code to run on page load */
});

11

Document.ready(một sự kiện jQuery) sẽ kích hoạt khi tất cả các phần tử được đặt đúng chỗ và chúng có thể được tham chiếu trong mã JavaScript, nhưng nội dung không nhất thiết phải được tải. Document.readythực thi khi tài liệu HTML được tải.

$(document).ready(function() {

    // Code to be executed
    alert("Document is ready");
});

Các window.loadtuy nhiên sẽ đợi cho trang được nạp đầy đủ. Điều này bao gồm khung bên trong, hình ảnh, vv

$(window).load(function() {

    //Fires when the page is loaded completely
    alert("window is loaded");
});

5

Sự kiện document. Yet xảy ra khi tài liệu HTML đã được tải và window.onload sự kiện luôn xảy ra sau đó, khi tất cả nội dung (hình ảnh, v.v.) đã được tải.

Bạn có thể sử dụng document.readysự kiện nếu bạn muốn can thiệp "sớm" vào quá trình kết xuất mà không cần chờ tải hình ảnh. Nếu bạn cần hình ảnh (hoặc bất kỳ "nội dung" nào khác) sẵn sàng trước khi tập lệnh của bạn "làm gì đó", bạn cần đợi cho đến khiwindow.onload .

Ví dụ: nếu bạn đang triển khai mẫu "Trình chiếu" và bạn cần thực hiện các phép tính dựa trên kích thước hình ảnh, bạn có thể muốn đợi cho đến khi window.onload. Nếu không, bạn có thể gặp một số vấn đề ngẫu nhiên, tùy thuộc vào tốc độ hình ảnh sẽ được tải. Kịch bản của bạn sẽ được chạy đồng thời với luồng tải hình ảnh. Nếu tập lệnh của bạn đủ dài hoặc máy chủ đủ nhanh, bạn có thể không nhận thấy sự cố, nếu hình ảnh xảy ra đúng lúc. Nhưng thực tế an toàn nhất sẽ là cho phép hình ảnh được tải.

document.ready có thể là một sự kiện tốt đẹp để bạn hiển thị một số dấu hiệu "đang tải ..." cho người dùng và khi window.onload , bạn có thể hoàn thành bất kỳ tập lệnh nào cần tài nguyên được tải, và cuối cùng xóa dấu hiệu "Đang tải ...".

Ví dụ: -

// document ready events
$(document).ready(function(){
     alert("document is ready..");
})

// using JQuery
$(function(){
   alert("document is ready..");
})

// window on load event
function myFunction(){
  alert("window is loaded..");
}
window.onload = myFunction;

2

window.onloadlà một hàm sẵn có của JavaScript. window.onloadkích hoạt khi trang HTML được tải. window.onloadchỉ có thể được viết một lần.

document.readylà một chức năng của thư viện jQuery. document.readykích hoạt khi HTML và tất cả mã JavaScript, CSS và hình ảnh được bao gồm trong tệp HTML được tải hoàn toàn. document.readycó thể được viết nhiều lần theo yêu cầu.


"window.onload là một hàm" không chính xác vì @ Ияя-Зеленько chứng tỏ nó là một thuộc tính và không phải là một hàm. Chi tiết: developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/ Lỗi trong khi. Yet () là một hàm và mong đợi một trình xử lý.
vik

1

Khi bạn nói $(document).ready(f), bạn bảo công cụ script thực hiện như sau:

  1. lấy tài liệu đối tượng và đẩy nó, vì nó không nằm trong phạm vi cục bộ, nó phải thực hiện tra cứu bảng băm để tìm tài liệu ở đâu, may mắn là tài liệu bị ràng buộc toàn cầu nên nó chỉ là một tra cứu.
  2. tìm đối tượng $và chọn nó, vì nó không nằm trong phạm vi cục bộ, nó phải thực hiện tra cứu bảng băm, có thể có hoặc không có va chạm.
  3. tìm đối tượng f trong phạm vi toàn cục, đó là một tra cứu bảng băm khác, hoặc đẩy đối tượng hàm và khởi tạo nó.
  4. gọi ready của đối tượng được chọn, bao gồm một bảng băm khác tra cứu vào đối tượng được chọn để tìm phương thức và gọi nó.
  5. làm xong.

Trong trường hợp tốt nhất, đây là 2 lần tra cứu bảng băm, nhưng đó là bỏ qua công việc nặng nhọc do jQuery thực hiện, trong đó $ là bồn rửa nhà bếp của tất cả các đầu vào có thể cho jQuery, do đó, một bản đồ khác có thể gửi truy vấn đến trình xử lý chính xác.

Ngoài ra, bạn có thể làm điều này:

window.onload = function() {...}

cái nào sẽ

  1. tìm cửa sổ đối tượng trong phạm vi toàn cầu, nếu JavaScript được tối ưu hóa, nó sẽ biết rằng vì cửa sổ không thay đổi, nó đã là đối tượng được chọn, vì vậy không cần phải làm gì.
  2. đối tượng chức năng được đẩy trên ngăn toán hạng.
  3. kiểm tra xem có phải onloadlà một thuộc tính hay không bằng cách thực hiện tra cứu bảng băm, vì nó là, nó được gọi như là một hàm.

Trong trường hợp tốt nhất, chi phí này tìm kiếm một bảng băm duy nhất, điều này là cần thiết bởi vì onloadphải được tìm nạp.

Lý tưởng nhất, jQuery sẽ biên dịch các truy vấn của họ thành các chuỗi có thể được dán để thực hiện những gì bạn muốn jQuery thực hiện nhưng không có thời gian chạy của jQuery. Bằng cách này, bạn có một tùy chọn

  1. làm công văn năng động của jquery như chúng ta làm ngày hôm nay.
  2. có jQuery biên dịch truy vấn của bạn thành chuỗi JavaScript thuần có thể được chuyển đến eval để làm những gì bạn muốn.
  3. sao chép kết quả của 2 trực tiếp vào mã của bạn và bỏ qua chi phí eval.

0

window.onload được cung cấp bởi DOM api và nó nói "sự kiện tải sẽ kích hoạt khi một tài nguyên nhất định đã được tải".

"Sự kiện tải kích hoạt vào cuối quá trình tải tài liệu. Tại thời điểm này, tất cả các đối tượng trong tài liệu đều ở trong DOM và tất cả các hình ảnh, tập lệnh, liên kết và khung phụ đã tải xong." Tải DOM

Nhưng trong jQuery $ (document). Yet () sẽ chỉ chạy khi trang Mô hình đối tượng tài liệu (DOM) đã sẵn sàng để mã JavaScript thực thi. Điều này không bao gồm hình ảnh, kịch bản, iframes, vv sự kiện sẵn sàng jquery

Vì vậy, phương thức jquery ready sẽ chạy sớm hơn sự kiện dom onload.

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.