Sự khác biệt giữa phương thức window.onload
của JavaScript và jQuery là $(document).ready()
gì?
$().ready()
làm cho nó khởi động sau window.onload
nhiều lần.
Sự khác biệt giữa phương thức window.onload
của JavaScript và jQuery là $(document).ready()
gì?
$().ready()
làm cho nó khởi động sau window.onload
nhiều lần.
Câu trả lời:
Sự ready
kiện xảy ra sau khi tài liệu HTML đã được tải, trong khi onload
sự kiện xảy ra sau đó, khi tất cả nội dung (ví dụ hình ảnh) cũng đã được tải.
Sự onload
kiện này là một sự kiện tiêu chuẩn trong DOM, trong khi ready
sự kiện này dành riêng cho jQuery. Mục đích của ready
sự 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.
ready
kiện này dành riêng cho jQuery. Nó đang sử dụng DOMContentLoaded
sự 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ì DOMContentLoaded
sự kiện này không được hỗ trợ trong tất cả các trình duyệt.
onload
. onload
là 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 load
sự kiện được kích hoạt.
window.onload
là 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ớiwindow.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.)load
sự 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à load
sự 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
.
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õ.
document.onload
có 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.
$(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()
:
$
bằngjQuery
khi bạn nhận được "$ không được xác định."$(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 onload
chức năng.
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(){}
và <body onload="func();">
là những cách khác nhau để sử dụng cùng một sự kiện.
$document.ready
Sự kiện chức năng jQuery thực thi sớm hơn một chút window.onload
và đượ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()
$(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>
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)
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.
$(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.
$(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)
.
$.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
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:
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.
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 onload
như bạn có thể với ready
. Nói cách khác, ma thuật jQuery cho phép nhiều ready
s 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 onload
sẽ ghi đè bất kỳ onload
s 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 */
});
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.ready
thự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.load
tuy 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");
});
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.ready
sự 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;
window.onload
là một hàm sẵn có của JavaScript. window.onload
kích hoạt khi trang HTML được tải. window.onload
chỉ có thể được viết một lần.
document.ready
là một chức năng của thư viện jQuery. document.ready
kí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.ready
có thể được viết nhiều lần theo yêu cầu.
Khi bạn nói $(document).ready(f)
, bạn bảo công cụ script thực hiện như sau:
$
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.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ó.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ẽ
onload
là 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ì onload
phả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
eval
.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.