为什么window.onload事件发生在$(document).ready之前?

Hoa*_* Vu 11 javascript jquery onload document-ready

如此线程中所述:window.onload vs $(document).ready().本window.onload应在随后发生的比$(document).ready(),但在这个简单的代码,日志会表明,onload事件发生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>
  <script>
    $(document).ready(function() {
      console.log("ready event fired");
    })
     window.onload = function() {
      console.log("onload event fired");
    }
  </script>
</body>

</html>
Run Code Online (Sandbox Code Playgroud)

Gaa*_*far 11

问题不在于事件的顺序.它与本机DOM事件周围的jQuery包装器.如果您尝试本机,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://stackoverflow.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>
Run Code Online (Sandbox Code Playgroud)