Jquery $(窗口).on(“加载”)在$(文档).ready之前执行。不应该';你还没准备好先执行吗? 文件 $(文档).ready(函数(){ var h=$(“#im”).height(); 警报(“准备就绪,高度为“+h”); }); $(窗口).on(“加载”,函数(){ var h=$(“#im”).height(); 警报(“来自负载的你好。高度为“+h”); });

Jquery $(窗口).on(“加载”)在$(文档).ready之前执行。不应该';你还没准备好先执行吗? 文件 $(文档).ready(函数(){ var h=$(“#im”).height(); 警报(“准备就绪,高度为“+h”); }); $(窗口).on(“加载”,函数(){ var h=$(“#im”).height(); 警报(“来自负载的你好。高度为“+h”); }); ,jquery,html,Jquery,Html,1) 以上是我的代码。当我在Chrome64(64位)中运行时。window.load部分在document.ready之前执行 2) 其次,根据我在这些论坛和网上其他地方读到的信息,我不应该从document.ready中获得图像高度,但是,它可以工作,我从这两个功能中获得相同的高度 为什么会发生这种情况?jQuery的ready事件首先由其延迟的实现处理,该实现在内部使用(可能是为了允许运行)。本质上是这样的: <!DOCTYPE html> <html lang="en"

1) 以上是我的代码。当我在Chrome64(64位)中运行时。window.load部分在document.ready之前执行

2) 其次,根据我在这些论坛和网上其他地方读到的信息,我不应该从document.ready中获得图像高度,但是,它可以工作,我从这两个功能中获得相同的高度


为什么会发生这种情况?

jQuery的
ready
事件首先由其
延迟的
实现处理,该实现在内部使用(可能是为了允许运行)。本质上是这样的:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="jquery-3.3.1.js"></script>
    <script>
        $(document).ready(function(){
            var h = $("#im").height();
            alert("Hello from ready. Height is " + h);
        });
        $(window).on("load", function(){
            var h = $("#im").height();
            alert("Hello from load. Height is " + h);
        });

    </script>
</head>
<body>
    <p class="" id="msg"></p>
    <p class="" id="msg2"></p>
    <img id="im" src="flower.jpg" alt="">

</body>
</html>
如果页面足够简单,使用
setTimeout(…,0)
可以延迟回调的执行,从而允许
load
事件首先运行回调。我在Chrome64.0.3282.186上测试了它,在
load
之前触发的jQuery
ready
事件只有大约10%的时间

如果您直接使用
document.addEventListener
,您的代码将按预期工作。

解决方案1 加载窗口后获取图像信息或向图像添加eventListener。

这是你的问题的答案

解决方案2 确实,当文档准备就绪时,只加载结构,相反,窗口加载所有组件,包括图像,更多组件准备就绪并加载

更多:


希望这能有所帮助。

获取图像高度是否有问题?我无法想象这怎么可能算作一个错误。此外,请清除缓存。浏览器可能能够直接告诉缓存图像的图像属性。我确信“
load
在所有图像完成加载之前发生”并不意味着“当
load
发生时,我们保证没有图像完成加载”。
document.addEventListener('DOMContentLoaded', function() {
    setTimeout(function() {
        // Your `ready` callback
    }, 0);
});
$(window).on('load', function() {/*Do Stuff*/}
$('#image').on('load', function() {/*Do Stuff*/}