$(window).load和$(document).ready有什么区别?

72
最近我的 JavaScript 代码出现了问题,将代码中的一部分从 $(document).ready() 移至 $(window).load() 后问题得到了解决。
我了解到 window.load 会在 document.ready 后立即触发,但为什么在 window.load() 之后还不准备好呢?

2
您可以在以下网址阅读文档:http://api.jquery.com/ready/ - epascarello
我写了一篇小文章,其中包含一个很好的参考链接,可以告诉你如何判断图片何时已经加载完成:http://amrelgarhy.com/blog/how-to-tell-when-images-have-loaded/。 - Amr Elgarhy
9个回答

76

load 在所有资源加载完成后被调用,包括图片。 ready 在文档可以交互之前被触发。

来自 MDC 的描述:window.onload

在文档加载过程中,载入(load)事件将在该过程结束时被激活。此时,在文档中的所有对象都已经被解析为DOM节点,并且所有的图像和子框架元素也已经完成了加载。

来自 jQuery API 文档的描述:.ready( handler )

虽然 JavaScript 提供了 load 事件,以便在页面呈现时执行代码,但是该事件直到所有诸如图片等的资源都完全接收后才会被触发。在大多数情况下,只要 DOM 层次结构已经完全构造,脚本就可以运行。传递给 .ready() 的处理函数保证在 DOM 就绪后执行,因此这通常是附加所有其他事件处理程序和运行其他 jQuery 代码的最佳位置。当使用依赖于CSS样式属性值的脚本时,重要的是在引用脚本之前引用外部样式表或嵌入样式元素。


在引用脚本之前引用外部样式表或嵌入样式元素非常重要。这与DOMContentLoaded的定义形成对比,jQuery.ready()使用该事件:“当初始HTML文档已完全加载和解析时,将触发DOMContentLoaded事件,而无需等待样式表、图像和子框架完成加载。”在异步环境中,“before”是一个棘手的词。有没有一种方法可以保证样式表在.ready()之前加载?将“link”标签放在“head”中是否可以保证这一点? - spekary

27

$(document).ready() 表示页面的DOM已经准备就绪,可以进行操作。

window.load() 会在整个页面(包括CSS和图像文件等组件)完全加载后触发。

你想要实现什么目标?


2
我试图操作图片,但当我在文档准备好时这样做时,我遇到了错误。后来我看到一个片段,它正在执行类似于我想要的操作,但他们代码中唯一的区别是他们使用了 $(window).load 而我使用的是 $(document).ready()。 - Mark McCook
是的,使用 $(window).load 是正确的选择。它可以检测您的图像是否成功加载。您只需在 $(document).ready 下传递 $(window).load 即可。因此,它应该像这样:$(document).ready($(window).load(){})。 - Faris Rayhan

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

在我们处理 jQuery 时,几乎每次都会使用上面的代码。

当我们想要在 DOM 准备就绪后初始化 jQuery 代码时,可以使用此代码。

$(window).load()

有时候您需要处理图片。例如,您想要垂直和水平对齐一张图片,并且您需要获取图片的宽度和高度才能实现此操作。如果访问者尚未加载图像,则使用 $(document).ready() 将无法完成此操作,那么您需要在图像完成加载时初始化 jquery 对齐功能。这就是我们使用 $(window).load() 的地方。


7

$(document).ready 是一个由 jQuery 触发的事件,当 DOM 加载完成时触发,因此它在文档结构准备好后触发。

$(window).load 事件是在整个内容(包括 CSS、图片等)加载完成后触发。

这是主要的区别。


4

$(document).ready() 把DOM内容包裹在 <body>...</body> 中。

$(window).load() 把所有DOM内容包裹在 <html>...</html> 中。

在你的情况下,可以使用它来节省渲染处理时间。


2
简单来说,window.load 在窗口的所有内容都加载完毕后被调用,而document.ready 是在 DOM 加载完成且文档结构准备好后被调用。

1

加载状态是指窗口对象已经创建并且所有必要的组件包括DOM已经加载到内存中,但尚未传递给渲染引擎以在页面中进行呈现。

另一方面,就绪状态确保DOM元素、事件和其他依赖组件已传递到渲染引擎,在页面上呈现,并准备好进行交互和操作。


1
  1. $(document).ready 与 $(window).load 事件相比速度更快的是滑块。

  2. $(document).ready 会在文档加载时触发,但 $(window).load 事件会在文档、CSS 和图片全部加载完毕后触发。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>   
  <script  src="https://code.jquery.com/jquery-1.12.4.js" ></script>
    <script> 
        $(window).load(function () {          
            var img = $('#img1');
      alert( "Image Height = " + img.height() + "<br>Image Width = " + img.width());          
        });
    </script>
</head>
<body>
    <form id="form1" runat="server">     
    <div>
        <img id="img1" src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTozkxoNSH8739juRXJJX5JxREAB6I30bFyexPoCdRVa2fKfH2d" />
    </div>
    </form>
</body>
</html>


-1

$(document).ready 是一个 jQuery 事件。它会在 DOM 加载完成并准备好被脚本操作时触发。这是页面加载过程中脚本可以安全地访问页面 HTML DOM 元素的最早时间点。在所有图片、CSS 等全部加载完成之前,该事件就已经被触发了。

window.load() 会在整个页面(包括 CSS 和图像文件等组件)完全加载后触发。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接