提问人:Vaibhav Jain 提问时间:9/13/2010 最后编辑:keepAliveVaibhav Jain 更新时间:8/30/2022 访问量:1167994
window.onload 与 $(document).ready()
window.onload vs $(document).ready()
问:
JavaScript 的 window.onload
和 jQuery 的 $(document).ready()
方法有什么区别?
答:
该事件发生在 HTML 文档加载之后,而事件发生在加载所有内容(例如图像)时。ready
onload
该事件是 DOM 中的标准事件,而该事件特定于 jQuery。该事件的目的是,它应该在文档加载后尽早发生,以便向页面中的元素添加功能的代码不必等待所有内容加载。onload
ready
ready
评论
DOMContentLoaded
DOMContentLoaded
readystatechanged
ready
onload
onload
load
window.onload
是内置的 JavaScript 事件,但由于它的实现在浏览器(Firefox、Internet Explorer 6、Internet Explorer 8 和 Opera)之间有微妙的怪癖,jQuery 提供了 ,它把这些抽象出来,并在页面的 DOM 准备就绪后立即触发(不等待图像等)。document.ready
$(document).ready
(请注意,它不是 ,这是未定义的)是一个 jQuery 函数,包装并为以下事件提供一致性:document.ready
DOMContentLoaded
- 加载文档的 DOM 时触发的新事件(可能在加载图像等之前的一段时间);同样,在 Internet Explorer 和世界其他地方略有不同- 和(即使在旧浏览器中也实现了),当整个页面加载(图像、样式等)时触发。
window.onload
评论
load
window
load
DOMContentLoaded
DOMContentReady
onload
DOMContentLoaded
document.onload
window.onload = fn1;window.onload=fn2;
与 Internet Explorer 一起使用时需要注意的一点。如果 HTTP 请求在加载整个文档之前中断(例如,当页面流式传输到浏览器时,单击另一个链接),则 IE 将触发该事件。$(document).ready()
$(document).ready
如果事件中的任何代码引用了 DOM 对象,则存在找不到这些对象的可能性,并且可能会发生 Javascript 错误。要么保护对这些对象的引用,要么将引用这些对象的代码推迟到 window.load 事件。$(document).ready()
我无法在其他浏览器(特别是 Chrome 和 Firefox)中重现此问题
评论
window.onload:一个普通的 JavaScript 事件。
document.ready:加载整个 HTML 时的特定 jQuery 事件。
$(document).ready()
是一个 jQuery 事件。一旦 DOM 准备就绪,JQuery 的方法就会被调用(这意味着浏览器已经解析了 HTML 并构建了 DOM 树)。这允许您在文档准备好进行操作后立即运行代码。$(document).ready()
例如,如果浏览器支持 DOMContentLoaded 事件(与许多非 IE 浏览器一样),则它将在该事件上触发。(请注意,DOMContentLoaded 事件仅在 IE9+ 中添加到 IE。
为此,可以使用两种语法:
$( document ).ready(function() {
console.log( "ready!" );
});
或者速记版本:
$(function() {
console.log( "ready!" );
});
要点:$(document).ready()
- 它不会等待图像加载。
- 用于在 DOM 完全加载时执行 JavaScript。将事件处理程序放在此处。
- 可多次使用。
- 替换为收到“$ is not defined”时。
$
jQuery
- 如果要操作图像,则不使用。请改用。
$(window).load()
window.onload()
是一个原生 JavaScript 函数。当页面上的所有内容(包括 DOM(文档对象模型)、横幅广告和图像)加载完毕时,将触发该事件。两者之间的另一个区别是,虽然我们可以有多个函数,但我们只能有一个函数。window.onload()
$(document).ready()
onload
评论
当页面上的所有内容(包括 DOM(文档对象模型)内容和异步 JavaScript、框架和图像)完全加载时,将触发 Windows 加载事件。您还可以使用 body onload=。两者都是一样的; 并且是使用同一事件的不同方式。window.onload = function(){}
<body onload="func();">
jQuery $document.ready
函数事件的执行时间稍早于页面,并在页面上加载 DOM(文档对象模型)后调用。它不会等待图像、帧完全加载。window.onload
摘自以下文章:$document.ready(
) 与 window.onload(
) 有何不同
评论
要记住的一件事(或者我应该说是回忆)是你不能像 .换句话说,jQuery魔术允许在同一页面上有多个s,但你不能用.onload
ready
ready
onload
最后一个将推翻任何先前的 s。onload
onload
一个很好的处理方法是使用一个显然由Simon Willison编写的函数,并在使用多个JavaScript Onload函数中进行了描述。
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).on('ready', handler)
绑定到 jQuery 中的 ready 事件。加载 DOM 时调用处理程序。图像等资产可能仍然丢失。如果文档在装订时已准备就绪,则永远不会调用它。jQuery 为此使用 DOMContentLoaded-Event,如果不可用,则模拟它。
$(document).on('load', handler)
是从服务器加载所有资源后将触发的事件。图像现已加载。虽然 onload 是一个原始 HTML 事件,但 ready 是由 jQuery 构建的。
功能
$(document).ready(handler)
其实是一个承诺。如果文档在调用时已准备就绪,则将立即调用处理程序。否则,它将绑定到 -Event。ready
在 jQuery 1.8 之前,作为 的别名存在。$(document).load(handler)
$(document).on('load',handler)
延伸阅读
评论
$.fn.load
$(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>
window.onload
是一个 JavaScript 内置函数。 在加载 HTML 页面时触发。 只能写入一次。window.onload
window.onload
document.ready
是 jQuery 库的一个函数。 当 HTML 和 HTML 文件中包含的所有 JavaScript 代码、CSS 和图像完全加载时触发。 可根据要求多次写入。document.ready
document.ready
评论
Document.ready
(jQuery 事件)将在所有元素都到位时触发,并且可以在 JavaScript 代码中引用它们,但不一定加载内容。 在加载 HTML 文档时执行。Document.ready
$(document).ready(function() {
// Code to be executed
alert("Document is ready");
});
但是,将等待页面完全加载。这包括内部框架、图像等。window.load
$(window).load(function() {
//Fires when the page is loaded completely
alert("window is loaded");
});
document.ready 事件在加载 HTML 文档时发生,并且该事件总是在加载所有内容(图像等)时发生。window.onload
如果要在渲染过程中“尽早”干预,而无需等待图像加载,则可以使用该事件。
如果您需要在脚本“执行某些操作”之前准备好图像(或任何其他“内容”),则需要等到 .document.ready
window.onload
例如,如果要实现“幻灯片放映”模式,并且需要根据图像大小执行计算,则可能需要等到 .否则,您可能会遇到一些随机问题,具体取决于图像加载的速度。您的脚本将与加载图像的线程同时运行。如果脚本足够长,或者服务器速度足够快,则如果图像碰巧及时到达,则可能不会注意到问题。但最安全的做法是允许加载图像。window.onload
document.ready
对于您来说,展示一些“加载中......”可能是一个很好的事件。登录给用户,然后,您可以完成任何需要加载资源的脚本,然后最后删除“正在加载...”标志。window.onload
例子:-
// 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;
这是一个 jQuery 事件,当 HTML 文档已完全加载时发生,而该事件稍后发生,当页面上的所有内容(包括图像)加载时。$(document).ready()
window.onload
此外,window.onload 是 DOM 中的纯 javascript 事件,而该事件是 jQuery 中的一个方法。$(document).ready()
$(document).ready()
通常是jQuery的包装器,以确保所有加载的元素都可以在jQuery中使用...
查看jQuery源代码,了解它是如何工作的:
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;
};
此外,我还创建了下面的图像作为两者的快速参考:
当你说 时,你告诉脚本引擎执行以下操作:$(document).ready(f)
- 获取对象文档并推送它,因为它不在本地范围内,因此它必须执行哈希表查找以查找文档的位置,幸运的是文档是全局绑定的,因此它是单个查找。
- 找到对象并选择它,因为它不在本地范围内,因此它必须执行哈希表查找,这可能会或可能不会发生冲突。
$
- 在全局范围内找到对象 F,这是另一个哈希表查找,或推送函数对象并初始化它。
- 调用选定对象,这涉及对选定对象进行另一个哈希表查找,以查找方法并调用它。
ready
- 做。
在最好的情况下,这是 2 个哈希表查找,但这忽略了 jQuery 完成的繁重工作,其中是 jQuery 所有可能输入的厨房水槽,因此可能会有另一个映射将查询分派给正确的处理程序。$
或者,您可以这样做:
window.onload = function() {...}
这将
- 在全局范围内找到对象窗口,如果 JavaScript 被优化,它会知道由于窗口没有改变,它已经选择了对象,所以不需要做任何事情。
- 函数对象被推送到操作数堆栈上。
- 通过进行哈希表查找来检查是否是属性,因为它是,因此它像函数一样被调用。
onload
在最好的情况下,这需要单个哈希表查找,这是必要的,因为必须获取。onload
理想情况下,jQuery会将其查询编译为字符串,这些字符串可以粘贴以执行您希望jQuery执行的操作,而无需jQuery的运行时调度。这样,您可以选择以下任一选项
- 像我们今天一样进行jQuery的动态调度。
- 让 jQuery 将您的查询编译为纯 JavaScript 字符串,该字符串可以传递给 eval 以执行您想要的操作。
- 将 2 的结果直接复制到代码中,并跳过 .
eval
小贴士:
始终使用 将事件添加到窗口。因为这样你就可以在不同的事件处理程序中执行代码。window.addEventListener
正确代码:
window.addEventListener('load', function () {
alert('Hello!')
})
window.addEventListener('load', function () {
alert('Bye!')
})
无效代码:
window.onload = function () {
alert('Hello!') // it will not work!!!
}
window.onload = function () {
alert('Bye!')
}
这是因为 onload 只是对象的属性,它被覆盖了。
与 类比,最好使用而不是加载。addEventListener
$(document).ready()
评论
window.onload 由 DOM api 提供,它说“加载给定资源时触发加载事件”。
“加载事件在文档加载过程结束时触发。此时,文档中的所有对象都在 DOM 中,并且所有的图像、脚本、链接和子帧都已完成加载。DOM 加载
但是在jQuery中,$(document).ready()只有在页面文档对象模型(DOM)准备好执行JavaScript代码时才会运行。这不包括图像、脚本、iframe 等。 jQuery Ready 事件
因此,jquery ready 方法将比 dom onload 事件更早运行。
时光荏苒,现在是 ECMAScript 2021,人们越来越少使用 IE11。相比之下,最多的两个事件是 load
和 DOMContentLoaded
。
DOMContentLoaded
在初始 HTML 文档完全加载并解析后触发。
加载在加载后触发,并且整个页面已加载,等待所有依赖资源完成加载
。资源示例:脚本、样式表、图像和 iframe 等。DOMContentLoaded
重要说明:同步脚本将暂停 DOM 的解析。
这两个事件都可用于确定 DOM 是否能够使用。例如:
<script>
// DOM hasn't been completely parsed
document.body; // null
window.addEventListener('DOMContentLoaded', () => {
// Now safely manipulate DOM
document.querySelector('#id');
document.body.appendChild();
});
/**
* Should be used only to detect a fully-loaded page.
*
* If you just want to manipulate DOM safely, `DOMContentLoaded` is better.
*/
window.addEventListener('load', () => {
// Safely manipulate DOM too
document.links;
});
</script>
评论
$().ready()
window.onload
$(window).on('load', function(){});