为什么 window.onload 事件发生在 $(document).ready 之前?
Why does window.onload event occur before $(document).ready?
如本帖所述:window.onload vs $(document).ready()。 window.onload
应该晚于 $(document).ready()
发生,但是在这个简单的代码中,日志会显示 onload
事件在就绪事件之前执行?我在这里错过了什么?
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
</head>
<body>
<h1>A Simple Site</h1>
<script>
$(document).ready(function() {
console.log("ready event fired");
})
window.onload = function() {
console.log("onload event fired");
}
</script>
</body>
</html>
@RoryMcCrossan 说得对,你的 html
中没有任何东西可以加载到 window
上,比如(图像、视频等)。现在您可以看到事件的行为是如何改变的
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<img src="http://www.wallpapereast.com/static/images/Unique-And-Beautiful-Wallpaper-HD.jpg" alt="Alternate Text" />
</head>
<body>
<h1>A Simple Site</h1>
<script>
$(document).ready(function() {
console.log("ready event fired");
})
window.onload = function() {
console.log("onload event fired");
}
</script>
</body>
</html>
问题不在于事件的顺序。它与 jQuery 包装原生 DOM 事件。如果您尝试原生 DOMContentLoaded
,您会发现它总是在 window.onload
之前运行。但是 jQuery 事件
$(document).ready
将在 DOMContentLoaded
之后几毫秒出现,在某些情况下也可能在 window.onload
之后,特别是如果页面没有像下面的代码那样需要加载太多内容。这是由于 jQuery 实施造成的延迟。
如果您取消注释代码中的 iframe,加载需要一些时间,导致 window.onload
延迟,因此 $(document).ready
将首先出现。
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
</head>
<body>
<h1>A Simple Site</h1>
<!-- <iframe src="http://whosebug.com"></iframe> -->
<script>
$(document).ready(function() {
console.log("jQuery ready");
})
document.addEventListener("DOMContentLoaded", function(event) {
console.log("DOM ready");
});
window.onload = function() {
console.log("DOM loaded");
}
</script>
</body>
</html>
这是 jQuery 3 的 "feature"。jQuery 1.X 总是 处理 $(document).ready在 $(window).on('load') 之前。此外, $(window).load() 可以被视为页面呈现时的事件。我对此有 100% 的把握,因为现在我刚刚尝试将 jQuery 版本升级到 3.X 的项目中,该项目与 jQuery 1.X 稳定工作了近 10 年年。所以这次尝试变成了一个月的头痛与$(document).ready 和$(window).load 的斗争。最后决定保留 jQuery 1.12.4,最新的 1.X 代。
如本帖所述:window.onload vs $(document).ready()。 window.onload
应该晚于 $(document).ready()
发生,但是在这个简单的代码中,日志会显示 onload
事件在就绪事件之前执行?我在这里错过了什么?
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
</head>
<body>
<h1>A Simple Site</h1>
<script>
$(document).ready(function() {
console.log("ready event fired");
})
window.onload = function() {
console.log("onload event fired");
}
</script>
</body>
</html>
@RoryMcCrossan 说得对,你的 html
中没有任何东西可以加载到 window
上,比如(图像、视频等)。现在您可以看到事件的行为是如何改变的
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<img src="http://www.wallpapereast.com/static/images/Unique-And-Beautiful-Wallpaper-HD.jpg" alt="Alternate Text" />
</head>
<body>
<h1>A Simple Site</h1>
<script>
$(document).ready(function() {
console.log("ready event fired");
})
window.onload = function() {
console.log("onload event fired");
}
</script>
</body>
</html>
问题不在于事件的顺序。它与 jQuery 包装原生 DOM 事件。如果您尝试原生 DOMContentLoaded
,您会发现它总是在 window.onload
之前运行。但是 jQuery 事件
$(document).ready
将在 DOMContentLoaded
之后几毫秒出现,在某些情况下也可能在 window.onload
之后,特别是如果页面没有像下面的代码那样需要加载太多内容。这是由于 jQuery 实施造成的延迟。
如果您取消注释代码中的 iframe,加载需要一些时间,导致 window.onload
延迟,因此 $(document).ready
将首先出现。
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
</head>
<body>
<h1>A Simple Site</h1>
<!-- <iframe src="http://whosebug.com"></iframe> -->
<script>
$(document).ready(function() {
console.log("jQuery ready");
})
document.addEventListener("DOMContentLoaded", function(event) {
console.log("DOM ready");
});
window.onload = function() {
console.log("DOM loaded");
}
</script>
</body>
</html>
这是 jQuery 3 的 "feature"。jQuery 1.X 总是 处理 $(document).ready在 $(window).on('load') 之前。此外, $(window).load() 可以被视为页面呈现时的事件。我对此有 100% 的把握,因为现在我刚刚尝试将 jQuery 版本升级到 3.X 的项目中,该项目与 jQuery 1.X 稳定工作了近 10 年年。所以这次尝试变成了一个月的头痛与$(document).ready 和$(window).load 的斗争。最后决定保留 jQuery 1.12.4,最新的 1.X 代。